目录
一、颜色加法
可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型。
颜色加法
OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。
# 饱和操作: cv.add(img1,img2) # Numpy直接相加是取模运算,如250+10 = 260%256 = 4 x = np.uint8([[250]]) y = np.uint8([[10]]) xy1 = cv.add(x,y) xy2 = x + y print(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 cv import 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 = 4 dst2 = cao + pig cv.imshow('dst2',dst2) # 颜色加权加法: cv.addWeighted(img1,alpha,img2,beta,gamma) : img1*alpha+img2*beta+gamma dst3 = 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)
# 转HSV
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('hsv',hsv)
# 转RGB
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('rgb',rgb)
cv.waitKey(0)
cv.destroyAllWindows()
三、灰度化
最大值法
对于彩色图像的每个像素,它会从R、G、B三个通道的值中选出最大的一个,并将其作为灰度图像中对应位置的像素值。
import cv2 as cv
import 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 cv import 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]))//3 cv.imshow('img', img) cv.waitKey(0) cv.destroyAllWindows()
注:图像数据都是整数,需要转换为int型,结果也必须为整数,所以整除
加权平均值法
对于彩色图像的每个像素,它会按照一定的权重去乘以每个通道的像素值,并将其相加,得到最后的值就是灰度图像中对应位置的像素值。
import cv2 as cv
import 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种阈值方法和自适应二值化;图像反转包括水平翻转、垂直翻转、双向翻转。
以上就是本章所有内容,感谢观看。