欢迎关注 『OpenCV 完整例程 100 篇』 系列,持续更新中
欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中
按照颜色对图像进行分类,可以分为二值图像、灰度图像和彩色图像。
OpenCV 中彩色图像使用 BGR 格式。彩色图像进行灰度化处理,可以在读取图像文件时直接读取为灰度图像,也可以通过颜色空间转换函数 cv2.cvtColor 将彩色图像转换为灰度图像。
灰度化处理相关函数和例程介绍,详见 [OpenCV 学习课-2.图像读取与显示]。
# 1.1 图像的读取
imgFile = "../images/imgLena.tif" # 读取文件的路径
img1 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR)
img2 = cv2.imread(imgFile, flags=0) # flags=0 读取为灰度图像
# 1.10 图像显示(plt.imshow)
imgRGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) # 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)
imGray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # 图片格式转换:BGR(OpenCV) -> Gray
进一步地,通过函数 cv2.threshold 可以对图像进行二值化处理。
函数说明:
cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
函数 threshold() 可以将灰度图像转换为二值图像,图像完全由像素 0 和 255 构成,呈现出只有黑白两色的视觉效果。
灰度阈值化通过选取的灰度阈值 thresh,将每个像素的灰度值与阈值进行比较,将灰度大于阈值的像素点置为最大灰度,小于阈值的像素点置为最小灰度,得到二值图像,可以突出图像轮廓,把目标从背景中分割出来。
参数说明:
注意:
# 1.47 固定阈值二值变换
img = cv2.imread("../images/imgLena.tif") # 读取彩色图像(BGR)
imgGray = cv2.imread("../images/imgLena.tif", flags=0) # flags=0 读取为灰度图像
# imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 颜色转换:BGR(OpenCV) -> Gray
# cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
ret1, img1 = cv2.threshold(imgGray, 63, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh=63
ret2, img2 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh=127
ret3, img3 = cv2.threshold(imgGray, 191, 255, cv2.THRESH_BINARY) # 转换为二值图像, thresh=191
ret4, img4 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_BINARY_INV) # 逆二值图像,BINARY_INV
ret5, img5 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_TRUNC) # TRUNC 阈值处理,THRESH_TRUNC
ret6, img6 = cv2.threshold(imgGray, 127, 255, cv2.THRESH_TOZERO) # TOZERO 阈值处理,THRESH_TOZERO
plt.figure(figsize=(9, 6))
titleList = ["1. BINARY(thresh=63)", "2. BINARY(thresh=127)", "3. BINARY(thresh=191)", "4. THRESH_BINARY_INV", "5. THRESH_TRUNC", "6. THRESH_TOZERO"]
imageList = [img1, img2, img3, img4, img5, img6]
for i in range(6):
plt.subplot(2, 3, i+1), plt.title(titleList[i]), plt.axis('off')
plt.imshow(imageList[i], 'gray') # 灰度图像 ndim=2
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接
Copyright 2021 youcans, XUPT
Crated:2021-11-18
欢迎关注 『OpenCV 完整例程 100 篇』 系列,持续更新中
欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中【OpenCV 完整例程】01. 图像的读取(cv2.imread)
【OpenCV 完整例程】02. 图像的保存(cv2.imwrite)
【OpenCV 完整例程】03. 图像的显示(cv2.imshow)
【OpenCV 完整例程】04. 用 matplotlib 显示图像(plt.imshow)
【OpenCV 完整例程】05. 图像的属性(np.shape)
【OpenCV 完整例程】06. 像素的编辑(img.itemset)
【OpenCV 完整例程】07. 图像的创建(np.zeros)
【OpenCV 完整例程】08. 图像的复制(np.copy)
【OpenCV 完整例程】09. 图像的裁剪(cv2.selectROI)
【OpenCV 完整例程】10. 图像的拼接(np.hstack)
【OpenCV 完整例程】11. 图像通道的拆分(cv2.split)
【OpenCV 完整例程】12. 图像通道的合并(cv2.merge)
【OpenCV 完整例程】13. 图像的加法运算(cv2.add)
【OpenCV 完整例程】14. 图像与标量相加(cv2.add)
【OpenCV 完整例程】15. 图像的加权加法(cv2.addWeight)
【OpenCV 完整例程】16. 不同尺寸的图像加法
【OpenCV 完整例程】17. 两张图像的渐变切换
【OpenCV 完整例程】18. 图像的掩模加法
【OpenCV 完整例程】19. 图像的圆形遮罩
【OpenCV 完整例程】20. 图像的按位运算
【OpenCV 完整例程】21. 图像的叠加
【OpenCV 完整例程】22. 图像添加非中文文字
【OpenCV 完整例程】23. 图像添加中文文字
【OpenCV 完整例程】23. 图像添加中文文字
【OpenCV 完整例程】24. 图像的仿射变换
【OpenCV 完整例程】25. 图像的平移
【OpenCV 完整例程】26. 图像的旋转(以原点为中心)
【OpenCV 完整例程】27. 图像的旋转(以任意点为中心)
【OpenCV 完整例程】28. 图像的旋转(直角旋转)
【OpenCV 完整例程】29. 图像的翻转(cv2.flip)
【OpenCV 完整例程】30. 图像的缩放(cv2.resize)
【OpenCV 完整例程】31. 图像金字塔(cv2.pyrDown)
【OpenCV 完整例程】32. 图像的扭变(错切)
【OpenCV 完整例程】33. 图像的复合变换
【OpenCV 完整例程】34. 图像的投影变换
【OpenCV 完整例程】35. 图像的投影变换(边界填充)
【OpenCV 完整例程】36. 直角坐标与极坐标的转换
【OpenCV 完整例程】37. 图像的灰度化处理和二值化处理