图像认知与OpenCV——图像预处理
目录
一、颜色加法
颜色加法
颜色加权加法
示例
二、颜色空间转换
RGB转Gray(灰度)
RGB转HSV
HSV转RGB
示例
三、灰度化
最大值法
平均值法
加权平均值法
四、图像二值化处理
阈值法
反阈值法
截断阈值法
低阈值零处理
超阈值法
OTSU
自适应二值化
均值
加权求和
五、图像翻转
总结
一、颜色加法
可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型。
颜色加法
OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。
# 饱和操作: cv.add(img1,img2)# Numpy直接相加是取模运算,如250+10 = 260%256 = 4x = np.uint8([[250]])y = np.uint8([[10]])xy1 = cv.add(x,y)xy2 = x + yprint(xy1,xy2)
xy1采用OpenCV中的饱和运算,最大值为255,因为250+10=260>255,所以xy1=255
xy2采用Numpy的加法,采用去摸运算,结果与256取模运算,260%255=4,所以xy2=4
颜色加权加法
cv.addWeighted(img1,alpha,img2,beta,gamma)
结果:img1*alpha+img2*beta+gammaimg1,img2为图片数据(数组)
alpha,beta为权重
gamma为亮度调整值
gamma > 0
,图像会变亮。
gamma < 0
,图像会变暗。
gamma = 0
,则没有额外的亮度调整。示例
import cv2 as cvimport numpy as np# 读取图片cao = cv.imread(\"../images/cao.png\")pig = cv.imread(\"../images/pig.png\")# 饱和操作: cv.add(img1,img2)dst1 = cv.add(cao,pig)# print(cao)# print(pig)# print(dst1)cv.imshow(\'dst1\',dst1)# Numpy直接相加是取模运算,如250+10 = 260%256 = 4dst2 = cao + pigcv.imshow(\'dst2\',dst2)# 颜色加权加法: cv.addWeighted(img1,alpha,img2,beta,gamma) : img1*alpha+img2*beta+gammadst3 = cv.addWeighted(pig,0.7,cao,0.3,0)cv.imshow(\'dst3\',dst3)cv.waitKey(0)cv.destroyAllWindows()
二、颜色空间转换
cv.cvtColor(img,code)
RGB转Gray(灰度)
code = cv.COLOR_BGR2GRAY
RGB转HSV
code = cv.COLOR_BGR2HSV
HSV转RGB
code = cv.COLOR_BGR2RGB
示例
import cv2 as cv# 读取图片img = cv.imread(\"../images/1.jpg\")# 颜色转换 cv.cvtColor(img,code)gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)cv.imshow(\'gray\',gray)# 转HSVhsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)cv.imshow(\'hsv\',hsv)# 转RGBrgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)cv.imshow(\'rgb\',rgb)cv.waitKey(0)cv.destroyAllWindows()
三、灰度化
最大值法
对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。
import cv2 as cvimport numpy as np# 读取图片pig = cv.imread(\"../images/pig.png\")img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)# 循环遍历for i in range(pig.shape[0]): for j in range(pig.shape[1]): img[i,j] = max(pig[i,j,:])cv.imshow(\"img\",img)cv.waitKey(0)cv.destroyAllWindows()
平均值法
对于彩色图像的每个像素,它会将R、G、B三个通道的像素值全部加起来,然后再除以三,得到的平均值就是灰度图像中对应位置的像素值。
import cv2 as cvimport numpy as np# 读取图片pig = cv.imread(\"../images/pig.png\")img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)# 循环遍历for i in range(pig.shape[0]): for j in range(pig.shape[1]): # int():转为更大的数据类型,防止溢出 img[i,j] = (int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))//3cv.imshow(\'img\', img)cv.waitKey(0)cv.destroyAllWindows()
注:图像数据都是整数,需要转换为int型,结果也必须为整数,所以整除
加权平均值法
对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。
import cv2 as cvimport numpy as np# 读取图片pig = cv.imread(\"../images/pig.png\")img = np.zeros((pig.shape[0],pig.shape[1]),dtype=np.uint8)# 定义权重wb,wg,wr=0.114,0.587,0.299# 循环遍历for i in range(pig.shape[0]): for j in range(pig.shape[1]): img[i,j] = round(wb*pig[i,j,0])+round(wg*pig[i,j,1])+round(wr*pig[i,j,2])cv.imshow(\"img\",img)cv.waitKey(0)cv.destroyAllWindows()
四、图像二值化处理
将某张图像的所有像素改成只有两种值之一
操作的图像必须为灰度图,所以处理前需要进行灰度化处理
_,binary = cv2.threshold(img,thresh,maxval,type)
img
:输入图像,要进行二值化处理的灰度图。
thresh
:设定的阈值。当像素值大于(或小于,取决于阈值类型)thresh
时,该像素被赋予的值。
type
:阈值处理的类型。返回值:
第一个值(通常用下划线表示):计算出的阈值,若使用自适应阈值法,会根据算法自动计算出这个值。
第二个值(binary):二值化后的图像矩阵。与输入图像尺寸相同。
阈值法
将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(通常代表背景),大于阈值的像素就被设置为maxval
type = cv.THRESH_BINARY
反阈值法
与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会变成0(黑),当灰度图的像素值小于等于阈值时,该像素值将会变成maxval
type = cv.THRESH_BINARY_INV
截断阈值法
截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小于等于阈值的部分不变
type = cv.THRESH_TRUNC
低阈值零处理
低阈值零处理,像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。
type = cv.THRESH_TOZERO
超阈值法
超阈值零处理,与低阈值零处理相反,就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0,像素值小于等于阈值的部分不变
type = cv.THRESH_TOZERO_INV
OTSU
OTSU算法就是在灰度图的像素值范围内遍历阈值T,使得g最大,基本上双峰图片的阈值T在两峰之间的谷底。
g就是前景与背景两类之间的方差,这个值越大,说明前景和背景的差别就越大,效果就越好。
THRESH_OTSU
通常与THRESH_BINARY
或THRESH_BINARY_INV
结合使用。type = cv.THRESH_BINARY+cv.THRESH_OTSU 或 cv.THRESH_BINARY_INV+cv.THRESH_OTSU
手动设置的thresh值无效,阈值通过OTSU函数自动计算
自适应二值化
自适应二值化更加适合用在明暗分布不均的图片
自适应二值化方法会对图像中的所有像素点计算其各自的阈值
与OTSU类似,必须且只能结合一个阈值法或反阈值法
cv2.adaptiveThreshold(image_np_gray, maxval , cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize , c)
blockSize
:选取的小区域的面积,如7就是7*7的小块。c
:最终阈值等于小区域计算出的阈值再减去此值均值
根据选中点一定范围内的平均值作为阈值
加权求和
根据高斯权重核求加权,对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布
五、图像翻转
cv2.flip(img,flipcode)
参数
im. 要翻转的图像
flipcode: 指定翻转类型的标志
flipcode=0: 垂直翻转,图片像素点沿x轴翻转
flipcode>0: 水平翻转,图片像素点沿y轴翻转
flipcode<0: 水平垂直翻转,水平翻转和垂直翻转的结合
示例
import cv2 as cv# 读取图片face = cv.imread(\"../images/face.png\")cv.imshow(\"face\",face)# 图像翻转/镜像旋转 : 以图像中心为原点 cv.flip(img,flipCode)# flipCode = 0 : 垂直翻转flip_0 = cv.flip(face,0)cv.imshow(\'flip_0\', flip_0)# flipCode = 1 : 水平翻转flip_1 = cv.flip(face,1)cv.imshow(\'flip_1\', flip_1)# flipCode = -1 : 水平垂直翻转flip_2 = cv.flip(face,-1)cv.imshow(\'flip_2\',flip_2)cv.waitKey(0)cv.destroyAllWindows()
效果
总结
本文介绍了图像预处理中的一些内容,颜色加法包括平均值和加权加法,其中平均值包括OpenCV饱和加法与Numpy模运算加法;颜色空间转换包括灰度、RGB、HSV三者的转换;灰度化处理包括最大值法、平均值法、加权平均值法;图像二值化处理包括5种阈值方法和自适应二值化;图像反转包括水平翻转、垂直翻转、双向翻转。
以上就是本章所有内容,感谢观看。