Notas do estudo OpenCV 03 -- operação de imagem -- operação de adição de imagem, operação de bit de imagem, máscara de imagem

contente

(1), operação de adição de imagem

(2), operação lógica de bits

(3) Máscara

(4) Outras operações lógicas de bits

(5) Decomposição de bitmap no processamento de imagem


Introdução: No processamento digital de imagens, alterar os pixels de uma imagem envolve alguns problemas operacionais. O foco deste artigo está nas operações de lógica de bits. Através de operações de lógica de bits, podemos encontrar alguma mágica. Usando operações de bits, podemos realizar a adição de marcas d'água, a criptografia e descriptografia de imagens e as imagens parciais das imagens que nos interessam também podem ser extraídas por operações lógicas. Digite o tópico abaixo.

(1), operação de adição de imagem

A operação de adição da imagem pode ser operada com o sinal '+' ou a função cv2.add() na biblioteca opencv, mas os resultados da operação das imagens obtidas por estes dois métodos são diferentes. Além disso, vamos apresentar o uso da função cv2.addWeighted().

Suponha que operamos em uma imagem de 8 bits. Ou seja, o valor de cada pixel está entre [0, 255].

Se o sinal '+' for utilizado para realizar a operação de adição de pixels da imagem, se o resultado após a adição for maior que 255, o cálculo é reiniciado a partir de 0, ou seja, a operação restante é realizada em 255.

Se a função cv2.add() for usada para a operação de adição, se o resultado após a adição for maior que 255, a atribuição uniforme será 255.

Vamos dar uma olhada no programa.

import cv2
import numpy as np
# 声明两个随机数组,大小为4*4
img1 = np.random.randint(0, 255, (4, 4), dtype=np.uint8)
img2 = np.random.randint(0, 255, (4, 4), dtype=np.uint8)

# 打印一下生成的随机数组
print('img1=\n', img1)
print('img2=\n', img2)

# 利用运算符+进行像素的加法运算
img3 = img1 + img2
print('img1 + img2 = \n', img3)
img4 = cv2.add(img1, img2)
print('cv2.add(img1, img2)=\n', img4)

A operação e os resultados são mostrados abaixo. Se houver pixels e maiores que 255, os resultados obtidos pelos dois métodos são diferentes:

 Sugestão: É melhor usar a função cv2.add(), pois se for usado o sinal '+', se a soma de pixels for 256, o resultado é 1, que muda do mais claro para o mais escuro, o que não fazemos Com cv2.add(), se exceder 255, o padrão é o valor máximo de 255. Não há como ir do pixel mais claro para o pixel mais escuro.

A operação de adição à nossa frente é adicionar os pixels direta e grosseiramente. A função cv2.addWeighted() pode ser implementada multiplicando o valor do pixel da imagem por um número, ou seja, participando da operação de adição em uma determinada proporção. O uso específico é o seguinte

cv2.addWeighted(img1, x1, img2, x2, b)

img1 e img2 representam dois arrays de imagens, x1 é o número a ser multiplicado por cada pixel da imagem img1, x2 é o número a ser multiplicado por cada pixel da imagem img2, b é o resultado da soma de img1 e img2 plus o valor de b.

Vejamos por exemplo, primeiro declare dois arrays, um cheio de 10, um cheio de 100, multiplicado por diferentes coeficientes 0,6, 0,4, mais um b=1.

import numpy as np
import cv2
# 利用加权值对像素进行处理cv2.addWeighted(x, a, y, b, c)
img5 = np.ones((4, 4), dtype=np.uint8) * 10
img6 = np.ones((4, 4), dtype=np.uint8) * 100
img7 = cv2.addWeighted(img5, 0.6, img6, 0.4, 1)
print('img5=\n', img5)
print('img6=\n', img6)
print('cv2.addWeighted(img5, 0.6, img6, 0.4)=\n', img7)

Os resultados são os seguintes:

 (2), operação lógica de bits

Aprendemos binário em matemática e introdução ao computador.A operação lógica de bits é uma operação baseada em binário. As principais operações são AND, OR, NOT e XOR. Essas operações de bit têm suas vantagens e suas funções opencv correspondentes são mostradas na tabela a seguir.

Nome da função significado básico
cv2.bitwise_and() pouco e
cv2.bitwise_or() pouco ou
cv2.bitwise_xor() XOR
cv2.bitwise_not() negar (não)

cv2.bitwise_and(img1, img2, mask=)

Os parâmetros das quatro funções acima são os mesmos, exceto pela negação de bits, aqui vamos explicar com uma delas.

img1 e img2: Essas duas são matrizes de matrizes, que podem ser a matriz de matriz correspondente à imagem ou a matriz de matriz definida por você.

mask: Indica uma máscara. É um parâmetro opcional, não obrigatório. Pode ser configurado de acordo com os requisitos. A explicação detalhada da máscara será dada posteriormente.

Em seguida, vamos dar uma olhada nas provisões teóricas dessas operações de bits.

Bit AND: 1 se todos os 1s, 0 caso contrário.

Bit OR: 0 se todos os 0s, 1 caso contrário.

Bit XOR: 0 se forem iguais, 1 se não forem.

Pouco não: é tomar o oposto. Se for 0, tome 1, se for 1, tome 0.

Como mostrado abaixo:

 Aplicação da operação bit AND

Mencionamos o princípio da operação do bit AND antes, se o mesmo for 1, é 1, caso contrário, é zero. Então vamos pensar sobre isso, se houver um valor de pixel de 6 agora, seu valor binário correspondente é 0000 0110, agora definimos outro valor de pixel de 255, o valor binário correspondente é: 1111 1111, e o binário de 6 e 255 é bit-anded O resultado é: 0000 0110. Ou seja, o resultado ainda é 6. Você pode tentar a operação AND binário com outros valores x e 255, e o resultado ainda é x.

Posso tirar as seguintes conclusões:

Realizamos uma operação de bit binário em qualquer número x com o número 255 e o resultado é o próprio bit.

Da mesma forma, se realizarmos uma operação binária em qualquer valor x com o valor 0, o resultado será sempre 0.

Usando as conclusões acima, podemos extrair a parte da imagem que nos interessa. Por exemplo, temos uma imagem e queremos extrair informações de rosto. Primeiro lemos uma imagem cinza, depois geramos uma matriz de matriz do mesmo tamanho da imagem e, em seguida, definimos alguns valores​​para 255 para obter as informações da imagem original, e alguns valores​​são definidos como 0 para exibir os lugares indesejados como preto. Implemente-o com o código a seguir.

import numpy as np
import cv2
# 读取一幅图像
filename = r'C:\Users\LBS\Desktop\lena.jpg'
f = cv2.imread(filename, 0)
cv2.imshow('01', f)
# 用位与操作,获取我们感兴趣的部分,利用全1则为1,否则为0的特点
Mat = np.zeros(np.shape(f), dtype=np.uint8)
Mat[100:400, 100:400] = 255
Mat[400: 500, 100:200] = 255
# 将定义的矩阵Mat和图像f进行位与操作
img8 = cv2.bitwise_and(f, Mat)
cv2.imshow('02', Mat)
cv2.imshow('03', img8)
cv2.waitKey()
cv2.destroyAllWindows()

O resultado da execução é o seguinte: a posição do pixel da imagem correspondente ao valor do pixel da matriz de 255 é exibida como o conteúdo da imagem original e os outros locais são exibidos em preto.

(3) Máscara

Uma máscara também é uma matriz de matrizes, consistindo em uma sequência de valores. Ele pode limitar a área de operação do bit, ou seja, operar na posição onde o valor da máscara não for igual a 0, e na posição onde a máscara for igual a zero, então atribuir todas as posições onde a máscara correspondente a 0 da imagem a ser operada é atribuído a 0, 0 ou seja, preto. Por exemplo, suponha que agora construímos dois arrays de matrizes Mat1, Mat2 e, em seguida, construímos uma máscara Mat3 e, em seguida, realizamos uma operação de adição nos dois arrays de matrizes (o mesmo vale para operações de bits, a adição é usada aqui para mostrar o uso de máscaras), então a adição A área de operação é executada na posição em que Mat3 não é igual a 0 e outras posições são atribuídas a 0.

código mostrar como abaixo:

import numpy as np
import cv2
# 掩膜,控制计算的范围,只在掩膜不等于1的位置进行操作,其余位置置为0。
Mat1 = np.ones((4, 4), dtype=np.uint8) * 6
Mat2 = np.ones((4, 4), dtype=np.uint8) * 4
# 定义一个掩膜,操作只会在掩膜值为非空的像素点上进行,将其它的像素点的值置为0
Mat3 = np.zeros((4, 4), dtype=np.uint8)
Mat3[2:4, 2:4] = 1
print('Mat1=\n', Mat1)
print('Mat2=\n', Mat2)
print('Mat3=\n', Mat3)
#在掩膜规定的非0位置处执行加法操作,也适用执行位逻辑操作。
Mat4 = cv2.add(Mat1, Mat2, mask=Mat3)
print('Mat4=\n', Mat4)

O resultado é o seguinte:

 A máscara é aplicada na imagem da seguinte forma:

import numpy as np
import cv2
# 读取彩色图像
filename = r'C:\Users\LBS\Desktop\lena.jpg'
f1 = cv2.imread(filename, 1)
cv2.imshow('f1', f1)
# 这里需要注意的是要提取出彩色图像的长宽,来构造掩膜的大小
w, h, c = np.shape(f1)
# 定义一个掩膜mask,操作只会在掩膜值为非空的像素点上进行,将其它的像素点的值置为0
mask = np.zeros((w, h), dtype=np.uint8)
mask[100:400, 100:400] = 255
mask[400:500, 100:200] = 255
# 执行位与运算
#f1 和 f1进行运算的结果还是f1,只不过是在mask指定的非0的区域上进行的操作
f2 = cv2.bitwise_and(f1, f1, mask=mask)
cv2.imshow('f2', f2)
cv2.waitKey()
cv2.destroyAllWindows()

O resultado da execução é o seguinte:

(4) Outras operações lógicas de bits

Operação de bit OR e operação de bit XOR, demos suas regras de cálculo no início, sua operação e operação de bit AND são as mesmas, e sua operação de bit XOR pode realizar a criptografia e descriptografia de imagens. A operação de bit AND também pode obter marca d'água e extração em nível de bit. Devido ao espaço limitado, os artigos a seguir irão implementá-los e explicá-los em detalhes .

(5) Decomposição de bitmap no processamento de imagem

 Aqui tomamos principalmente a imagem cinza para ilustração. Se temos um pixel de imagem com 8 bits, significa que agora temos um valor de pixel de 6, que pode ser representado por binário, que tem 8 bits, que é 0000 0110. Então vamos pensar se podemos desmontar esses oito bits, então uma imagem consiste em vários valores de pixel, e então cada valor de pixel pode ser convertido em binário de 8 bits, então convertemos cada bit do binário de cada pixel É possível extrair 8 imagens extraindo-as separadamente? Por exemplo, considero a imagem atual como um array de binários.Para a imagem existente, extraio o 7º bit do binário de cada pixel, então o valor do sétimo bit correspondente a cada pixel é extraído para formar uma imagem. Artigos subsequentes também resumirão notas sobre decomposição de bitmaps em detalhes.

Não é fácil escrever, por favor, indique a fonte ao reimprimir.

Acho que você gosta

Origin blog.csdn.net/BaoITcore/article/details/124025061
Recomendado
Clasificación