Ambiente de teste
Instale a biblioteca
Precisamos instalar várias bibliotecas sobre python usando OpenCV
- opencv-python
- opencv-contrib-python
- pytesseract
Em seguida, o método de instalação normal é inserir o nome da biblioteca de instalação do pip na linha de comando do cmd,
mas a velocidade do download é muito lenta, portanto, precisamos usar o espelho para baixar o
python -m pip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 库名
Copie tudo para cmd, altere o nome da biblioteca para a biblioteca que você escolher e faça o download
Ambiente de teste
import cv2 as cv
src = cv.imread("C:/Users/acer/Desktop/Other/img/01.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
cv.waitKey(0)
cv.destroyAllWindows()
Há 2 pontos a serem observados aqui:
1. Certifique-se de importar a biblioteca cv2 primeiro
2. Leia o endereço de uma imagem da máquina em cv.imread
Nesse momento, uma imagem aparecerá quando você clicar em Executar, o que significa que o ambiente foi criado com sucesso
Se o comentário em chinês estiver errado, adicione no topo # coding:utf-8
Obter imagem completa
# coding:utf-8
import cv2 as cv
src = cv.imread("01.jpg")
src2 = cv.imread("01.jpg",cv.IMREAD_GRAYSCALE)#读取灰度图像
cv.imshow("image",src) #给窗口指定一个名字
cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口
- coding: utf-8: define o formato de codificação para utf-8
- importar cv2 como cv importar biblioteca opencv chamamos cv
- Leia uma figura no cv.imread, esta figura está no meu projeto, então escreva o nome diretamente, se você escrever o caminho completo em outro lugar
- cv.imread ("01.jpg", cv.IMREAD_GRAYSCALE) O parâmetro por trás é definir para ler a imagem em escala de cinza
- O primeiro parâmetro do imshow é o nome, o segundo parâmetro é a imagem
- waitkey tempo de espera
- Operação destroyAlliwindows para fechar a janela
shape pode representar o número de linhas, colunas e canais de cores na opencv nas coordenadas da imagem
Tire algumas fotos
src = cv.imread("01.jpg")
demo = src[0:50,0:200]
cv.imshow("image",demo) #给窗口指定一个名字
cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口
- Ler imagens através da leitura
- Por nome da imagem [0: 50,0: 200] altura 50 largura 200
- O restante da operação é semelhante à imagem completa
Ler vídeo
# coding:utf-8
import cv2 as cv
vc = cv.VideoCapture("test.mp4");
if vc.isOpened():
open, frame = vc.read() # open 是布尔值,frame是当前这一帧的图像
else:
open = False
while open: #如果open是true就是能打开 进入while循环
ret, frame = vc.read() #读一下
if frame is None: #如果这个帧为空,就是没有下一帧了,就结束
break
if ret == True: #读这一帧数没错误
gray = cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
#转换成灰度图 frame:传递当前这一帧,COLOR_BGR2GRAY:生成灰度图
cv.imshow('result',gray) #展示结果,名字result 传进来gray
if cv.waitKey(10) & 0xFF == 27: #0xFF == 27 代表执行过程中按一个键就退出
break
vc.release()
cv.destroyAllWindows()
- cv.VideoCapture ("test.mp4") Obter caminho do endereço de vídeo
- open é um valor booleano que representa se o vídeo deve ser aberto; frame é a imagem do frame atual
- cv.cvtColor (quadro, cv.COLOR_BGR2GRAY) Converta em imagem em escala de cinza, quadro atual do quadro, COLOR_BGR2GRAY: gerar imagem em escala de cinza
- 0xFF == 27 significa pressionar uma tecla durante a execução para sair
BGR
Apenas R
# coding:utf-8
import cv2 as cv
src = cv.imread("01.jpg")
cur_img = src.copy()
cur_img[:,:,0] = 0
cur_img[:,:,1] = 0
cv.imshow('R',cur_img)
cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口
Ao definir BGR para manter apenas R BG em 0
Mantenha apenas G
# coding:utf-8
import cv2 as cv
src = cv.imread("01.jpg")
cur_img = src.copy()
cur_img[:,:,0] = 0
cur_img[:,:,2] = 0
cv.imshow('G',cur_img)
cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口
Ao definir BGR, mantenha apenas G BR em 0
Mantenha apenas B
# coding:utf-8
import cv2 as cv
src = cv.imread("01.jpg")
cur_img = src.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv.imshow('B',cur_img)
cv.waitKey(0) #等待时间,毫秒,0表示任意键终止
cv.destroyAllWindows() #触发关闭操作,关闭窗口
Configurando BGR para manter apenas B GR em 0
Preenchimento de limites
top_size,bottom_size,left_size,right_size = (50,50,50,50)
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)
Desenho através do matplot
import matplotlib.pyplot as plt
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
plt.show()
- BORDER_REPLICATE: Copie o método, ou seja, copie os pixels da borda.
- BORDER_REFLECT: método de reflexão, copie os pixels na imagem de interesse de ambos os lados.Por exemplo: fedcba | abcdefgh | hgfedcb
- BORDER_REFLECT_101: método de refletância, ou seja, com o pixel da borda como eixo, simetria, gfedcb | abcdefgh | gfedcba
- BORDER_WRAP: método de embalagem externa cdefgh | abcdefgh | abcdefg
- BORDER_CONSTANT: método constante, preenchimento de valor constante.
Cálculo numérico
Adquira cães e gatos, então cães = gatos + 10 e obtenha as 5 primeiras linhas do resultado final
img_cat=cv2.imread('cat.jpg')
img_dog=cv2.imread('dog.jpg')
img_cat2= img_cat +10
img_cat[:5,:,0]
array([[142, 146, 151, ..., 156, 155, 154],
[107, 112, 117, ..., 155, 154, 153],
[108, 112, 118, ..., 154, 153, 152],
[139, 143, 148, ..., 156, 155, 154],
[153, 158, 163, ..., 160, 159, 158]], dtype=uint8)
Veja o valor do gato 2 no momento
img_cat2[:5,:,0] #查看此时猫2的值
array([[152, 156, 161, ..., 166, 165, 164],
[117, 122, 127, ..., 165, 164, 163],
[118, 122, 128, ..., 164, 163, 162],
[149, 153, 158, ..., 166, 165, 164],
[163, 168, 173, ..., 170, 169, 168]], dtype=uint8)
Cat 1 + Cat 2 é 142 + 152 = 294 razoavelmente, a primeira linha é 38
, porque a unidade8 possui apenas 0-255 bits, portanto, o resultado precisa levar o restante de% 256, ou seja, 294-255 = 38
#相当于% 256
(img_cat + img_cat2)[:5,:,0]
array([[ 38, 46, 56, ..., 66, 64, 62],
[224, 234, 244, ..., 64, 62, 60],
[226, 234, 246, ..., 62, 60, 58],
[ 32, 40, 50, ..., 66, 64, 62],
[ 60, 70, 80, ..., 74, 72, 70]], dtype=uint8)
Adicionando esse complemento, ele produzirá% 255 em vez de% 255 após cruzar o limite
cv2.add(img_cat,img_cat2)[:5,:,0]
array([[255, 255, 255, ..., 255, 255, 255],
[224, 234, 244, ..., 255, 255, 255],
[226, 234, 246, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
Fusão de imagem
Quando adicionado diretamente
img_cat + img_dog
ValueError: operands could not be broadcast together with shapes (414,500,3) (429,499,3)
Um erro será relatado, dizendo que os dois valores não são os mesmos e não há como adicioná-los.
Em seguida, é necessário executar a operação de redimensionamento para torná-la a mesma.
Através do redimensionamento (objeto de imagem, o valor que precisa ser alterado)
img_dog = cv2.resize(img_dog, (500, 414))
img_dog.shape
(414, 500, 3)
addWeighted
res = cv2.addWeighted(img_cat, 0.4, img_dog, 0.6, 0)
plt.imshow(res)
res = cv2.resize(img, (0, 0), fx=4, fy=4)
plt.imshow(res)
Aqui você define 0, 0, mas define o múltiplo por fx e fy para alterar
res = cv2.resize(img, (0, 0), fx=1, fy=3)
plt.imshow(res)
Limiar de imagem
ret, dst = cv2.threshold(src, thresh, maxval, type)
- src: imagem de entrada, somente imagem de canal único pode ser inserida, geralmente imagem em escala de cinza
- dst: gráfico de saída
- thresh: threshold
- maxval: quando o valor do pixel excede o limite (ou é menor que o limite, determinado pelo tipo), o valor atribuído
- tipo: o tipo de operação binária, incluindo os 5 tipos a seguir: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO; cv2.THRESH_TOZERO_INV
- cv2.THRESH_BINARY excede o limite para obter maxval (valor máximo), caso contrário, leva 0
- cv2.THRESH_BINARY_INV Inversão de THRESH_BINARY
- cv2.THRESH_TRUNC maior que o limite é definido como o limite, caso contrário, inalterado
- cv2.THRESH_TOZERO maior que o limite não muda, caso contrário, defina como 0
- cv2.THRESH_TOZERO_INV Inversão de THRESH_TOZERO
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
Suavização de imagem
img = cv2.imread('lenaNoise.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方框滤波
# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)
cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)
cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5) # 中值滤波
cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()