函数原型:
cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst
功能
:转换图像颜色空间。
参数
:
内置函数示例代码:
import cv2
img = cv2.imread("color.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
灰度处理的原理是将彩色图像转换成灰度图像
,通常使用的方法是将彩色图像的RGB三个通道的值加权平均,得到一个灰度值,再用这个灰度值代替RGB三个通道的值,从而得到灰度图像。常用的加权平均公式是:
g r a y = 0.299 × R + 0.587 × G + 0.114 × B gray = 0.299 \times R + 0.587 \times G + 0.114 \times B gray=0.299×R+0.587×G+0.114×B
其中, R 、 G 、 B R、G、B R、G、B分别是彩色图像的红、绿、蓝通道的值, 0.299 、 0.587 、 0.114 0.299、0.587、0.114 0.299、0.587、0.114是加权系数,这些系数是心理物理学中根据人眼对不同颜色敏感度的实验结果得出的。这个公式也称为亮度加权法,能够比较好地保留彩色图像的明暗对比度。
通过原理实现灰度处理代码:
import cv2
img = cv2.imread('lean.jpg')
img = cv2.resize(img, (240, 240), interpolation=cv2.INTER_CUBIC)
height, width = img.shape[:2]
gray = np.zeros((height, width, 1), dtype="uint8")
for i in range(height):
for j in range(width):
gray[i][j] = img[i][j][0] * 0.114 + img[i][j][1] * 0.587 + img[i][j][2] * 0.299 # 加权值法
# gray[i][j] = (img[i][j][0] +img[i][j][1]+img[i][j][2])/3#平均值法
# gray[i][j] = max(img[i][j][0],img[i][j][1],img[i][j][2]) #最大值法
cv2.imshow("Gray", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述代码逐个像素点计算灰度值,然后用灰度值代替RGB三个通道的值,得到灰度图像并显示出来。值得注意的是,这种方法虽然简单易懂,但计算每个像素点的灰度值,效率较低,不适用于处理较大的图像。在实际中,我们可以使用OpenCV提供的函数来实现灰度处理,以提高程序的执行效率。
注意:灰度图像在Python中数据类型是numpy的uint8类型,即8位无符号整型。
图像二值化处理是将灰度图像上的像素点转化为黑白两种颜色的处理方法。
其原理是将灰度图像的像素值按一定的阈值进行分割,大于等于阈值的像素值设为一个值(通常是255),小于阈值的像素值设为另一个值(通常是0)。这样得到的图像就只有黑白两种颜色,便于进行一些形态学处理和特征提取。
图像二值化有两种方法:全局阈值和自适应阈值
。全局阈值
是指将整个图像的像素值都按照同一个阈值进行分割,而自适应阈值
则是将图像分割成若干个小块
,然后对每个小块单独
计算阈值,从而得到更准确的分割结果。下面分别介绍这两种方法的实现方式。
在OpenCV中,使用cv2.threshold()
函数可以实现全局阈值二值化。函数原型如下:
retval, dst = cv2.threshold(src, thresh, maxval, type)
参数说明:
示例代码如下:
import cv2
# 加载灰度图
img_gray = cv2.imread('lena_gray.jpg', 0)
# 全局阈值二值化
retval, img_binary = cv2.threshold(img_gray, 128, 255, cv2.THRESH_BINARY)
# 显示图像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()
其中,使用cv2.imread()加载灰度图时,第二个参数必须设置为0,表示加载灰度图。
在OpenCV中,使用cv2.adaptiveThreshold()
函数可以实现自适应阈值二值化
。函数原型和前面的cv2.threshold()函数类似,但多了两个参数:
dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
参数说明:
import cv2
# 加载灰度图
img_gray = cv2.imread('lena_gray.jpg', 0)
# 自适应阈值二值化
img_binary = cv2.adaptiveThreshold(
img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 127, 1)
# 显示图像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()
其中,使用cv2.ADAPTIVE_THRESH_MEAN_C作为自适应阈值算法,计算每个小块的平均值;使用cv2.THRESH_BINARY作为阈值处理的类型。阈值大小由blockSize
和C
两个参数共同决定,可以通过调整这两个参数来得到更适合的分割效果。