前言
要求opencv版本4.1.2.30(4.x >=版本),我的版本4.5.3
一、两图像的像素操作
Opencv4提供了求取两幅图像中较大或者较小灰度值的cv.max,和cv.min,这两个函数依次比较两幅图像中灰度值的大小,保留较大(较小)的灰度值。
dst = cv.max(src1,src2) dst=cv.min(src1,src2)
src1:第一幅图像.可以是任意通道数的矩阵; src2:矩阵尺寸和通道数参数与第一个一致; det:操作后保留的图像
Max_and_min.py 代码示例
import cv2 as cv
import numpy as np
if __name__ =='__main__':
a = np.array([1,2,3.3,4,5,9,5,7,8.2,9,10,2])
b = np.array([1,2.2,3,1,3,10,6,7,8,9.3,10,1])
img1 = np.reshape(a,(3,4))
img2 = np.reshape(b,(3,4))
img3 = np.reshape(a,(2,3,2))
img4 = np.reshape(b,(2,3,2))
#对两幅单通道图像进行比较
max12 = cv.max(img1,img2)
min12 =cv.min(img1,img2)
#对两幅多通道图像进行比较
max34 = cv.max(img3,img4)
min34 = cv.min(img3,img4)
#对两幅彩色图像进行比较
img5 = cv.imread('./chapter_3/lena.jpg')
img6 = cv.imread('./chapter_3/flower.jpg')
max56 = cv.max(img5,img6)
min56 = cv.min(img5,img6)
cv.imshow('conmax',max56)
cv.imshow('conmin',min56)
#对两幅灰度图像进行比较
img7 = cv.cvtColor(img5,cv.COLOR_BGR2GRAY)
img8 = cv.cvtColor(img6,cv.COLOR_BGR2GRAY)
max78= cv.max(img7,img8)
min78 = cv.min(img7,img8)
cv.imshow('conMax_GRAY',max78)
cv.imshow('conMin_GRAY',min78)
#与掩码图像进行比较
#生成一个300x300的低通掩码矩阵
src = np.zeros((512,512,3),dtype='uint8')
src[100:400:,100:400:] = 255 #(x1:x2:,y1,y2:)
min_img5_src = cv.min(img5,src)
cv.imshow('Min img5 src',min_img5_src)
#生成一个显示红色通道的低通掩码矩阵
src1 = np.zeros((512,512,3),dtype='uint8')
src1[:,:,2] = 255
min_img5_src1 = cv.min(img5,src1)
cv.imshow('Min img5 src1',min_img5_src1)
#关闭窗口
cv.waitKey(0)
cv.destroyAllWindows()
运行结果展示:
二、两幅图像的逻辑运算
Opencv4针对两幅图像之间的"与" “或” “异或”"非"运算提供了cv.bitwise_and, cv.bitwise_or,cv.bitwise_xor,cv.bitwise_not函数; 数据类型为uint8的图像中像素值的范围为0~255,逻辑运算时将像素值转化成二进制再进行。
det=cv.bitwise_and(src1,src2) det=cv.bitwise_or(src1,src2) det=cv.bitwise_xor(src1,src2) det=cv.bitwise_not(src)
src1:第一幅图像.可以是任意通道数的矩阵; src2:矩阵尺寸和通道数参数与第一个一致; src:输入的掩码 det:操作后保留的图像
1.Logic_Operation.py
import cv2 as cv
import numpy as np
import sys
if __name__ =='__main__':
#创建两幅黑白图像
img1 = np.zeros((200,200),dtype='uint8')
img2 = np.zeros((200,200),dtype='uint8')
img1[50:150,50:150] = 255
img2[100:200,100:200] = 255
img = cv.imread('./chapter_3/lena.jpg')
if img is None:
print('Failed to read img')
sys.exit()
#进行逻辑运算
Not = cv.bitwise_not(img1)
And = cv.bitwise_and(img1,img2)
Or = cv.bitwise_or(img1,img2)
Xor = cv.bitwise_xor(img1,img2)
img_Not = cv.bitwise_not(img)
cv.imshow('img1',img1)
cv.imshow('img2',img2)
cv.imshow('Not',Not)
cv.imshow('And',And)
cv.imshow('Xor',Xor)
cv.imshow('Origin',img)
cv.imshow('Img_Not',img_Not)
cv.waitKey(0)
cv.destroyAllWindows()
结果展示:
三.图像的二值化
将非二值化图像经过计算变成二值图像的过程称为图像的二值化或者阈值化。Opencv4提供了cv.threshold()和cv.adaptiveThreshold()两个函数用于实现图像的二值化。
retval,dst = cv.threshold(src,thres,maxval,type)
src:待二值化的图像,数据只能是uint8和float32 thresh:二值化的阈值 maxval:二值化过程中的最大值。只在cv.THRESH_BINARY和cv.THRESH_BINARY_INV两种二值化方法中发挥作用,但在其他方法是也需要输入 type:选择图像二值化方法的标志 det:二值化后的图像 cv.threshold()函数在全局只使用一个阈值,在实际情况下,由于光照不均匀及阴影的存在,全局只有一个阈值会使得阴影处的白色区域也会被函数二值化成黑色区域,因此cv.adaptiveThresshold()函数提供了两种局部自适应阈值的二值方法,。
dst = cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize. C) src:待二值化图像 maxValue:二值化的最大值 adaptiveMathod:自适应阈值的方法 threshold:图像二值化的方法标志; blockSize:自适应确定阈值的像素领域大小; C:从平均值或者加权平均值减去的常数
Threshold.py代码示例:
import cv2 as cv
import numpy as np
import sys
if __name__ =='__main__':
img = cv.imread('./chapter_3/lena.jpg')
if img is None:
print('Failed to read img')
sys.exit()
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#彩色图像二值化
_,img_B=cv.threshold(img,125,125,type=cv.THRESH_BINARY)
_,img_B_V=cv.threshold(img,125,255,cv.THRESH_BINARY_INV)
cv.imshow('img_B',img_B)
cv.imshow('img_B_V',img_B_V)
#灰度图像二值化
_,gray_B=cv.threshold(gray,125,255,cv.THRESH_BINARY)
_,gray_B_V=cv.threshold(gray,125,255,cv.THRESH_BINARY_INV)
cv.imshow('gray_T',gray_B)
cv.imshow('gray_T_V',gray_B_V)
#灰度图像TOZERO变化
_,gray_T=cv.threshold(gray,125,255,cv.THRESH_TOZERO)
_,gray_T_V=cv.threshold(gray,125,255,cv.THRESH_TOZERO_INV)
cv.imshow('gray_T',gray_T)
cv.imshow('gray_T_V',gray_T_V)
#灰度图像TRUNC
_,gray_TRUNC=cv.threshold(gray,125,255,cv.THRESH_TRUNC)
cv.imshow('gray_TRUNC',gray_TRUNC)
#灰度图像大津法和三角形法二值化
img1=cv.imread('./chapter_3/Threshold.png',cv.IMREAD_GRAYSCALE)
_,img1_O=cv.threshold(img1,100,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
_,img1_T=cv.threshold(img1,125,255,cv.THRESH_BINARY|cv.THRESH_TRIANGLE)
cv.imshow('img1',img1)
cv.imshow('img1_o',img1_O)
cv.imshow('img1_T',img1_T)
#灰度图像自适应二值化
adaptive_mean=cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,13,0)
adaptive_gauss=cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,13,0)
cv.imshow('adaptive_mean',adaptive_mean)
cv.imshow('adaptive_gauss',adaptive_gauss)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果展示:
|