OpenCV 图像操作:颜色识别、替换与水印添加
目录
引言
代码实现
1. 导入必要的库
2. 图像加法
3. 图像直接相加
4. 颜色加权加法
5. HSV 颜色空间转换
概念
作用
6. 查找颜色范围对应的像素点
7. 与运算 - 生成掩膜
8. 添加水印
9. 主函数
总结
引言
在计算机视觉领域,OpenCV 是一个强大的库,提供了丰富的图像操作功能。本文将详细介绍如何使用 OpenCV 进行图像加法、颜色加权加法、HSV 颜色空间转换、颜色范围查找、与运算生成掩膜以及添加水印等操作,并给出相应的 Python 代码示例。
代码实现
1. 导入必要的库
import cv2
import numpy as np
2. 图像加法
我们可以使用OpenCV的cv.add()函数把两幅图像相加,或者可以简单地通过numpy操作添加两个图像,如res = img1 + img2。两个图像应该具有相同的大小和类型。
# 图像加法
def test001():img = cv2.imread("./opencv_work/src/view.png", cv2.IMREAD_GRAYSCALE)print(img.shape, type(img))img2 = img + 25cv2.imshow("img", img)cv2.imshow("img2", img2)cv2.waitKey(0)
这段代码读取一张灰度图像,并将每个像素值加上 25,然后显示原始图像和处理后的图像。
原图:
处理后的图像:
3. 图像直接相加
图像直接相加就是把两个图像对应像素的颜色值直接相加。在 OpenCV 里,借助 cv2.add()
函数来实现该操作。
def test002():img1 = cv2.imread("./opencv_work/src/view.png")img2 = cv2.imread("./opencv_work/src/laohu.png")img3 = cv2.add(img1, img2) # 特别亮的地方相加会变的更亮cv2.imshow("img1", img1)cv2.imshow("img2", img2)cv2.imshow("img3", img3)cv2.waitKey(0)
此代码读取两张彩色图像,并将它们直接相加,然后显示三张图像。
相加后的图像:
4. 颜色加权加法
颜色加权加法是给每个图像的像素颜色值赋予不同的权重,然后再相加,最终可以得到混合效果。在 OpenCV 中,使用 cv2.addWeighted()
函数实现。
# 颜色加权加法
def test003():img1 = cv2.imread("./opencv_work/src/view.png")img2 = cv2.imread("./opencv_work/src/laohu.png")img3 = cv2.addWeighted(img1, 0.5, img2, 0.5, 0) # 特别亮的地方相加会变的更亮cv2.imshow("img1", img1)cv2.imshow("img2", img2)cv2.imshow("img3", img3)cv2.waitKey(0)
这里使用 cv2.addWeighted
函数对两张图像进行加权相加,权重分别为 0.5,最后显示处理后的图像。
相加后的图像:
5. HSV 颜色空间转换
概念
在计算机视觉和图像处理里,常见的颜色空间有 BGR(Blue, Green, Red)和 HSV。BGR 是按照红、绿、蓝三个颜色通道来表示颜色,这也是计算机显示器常用的颜色表示方式。而 HSV 颜色空间则是从人类感知颜色的角度出发,将颜色信息分解为三个独立的分量:
- 色调(Hue):反映颜色的种类,比如红色、绿色、蓝色等,取值范围通常是 0 - 360°,在 OpenCV 中一般缩放到 0 - 180。
- 饱和度(Saturation):表示颜色的鲜艳程度,饱和度越高,颜色越鲜艳;饱和度为 0 时,颜色为灰色。取值范围是 0 - 255。
- 亮度(Value):指颜色的明亮程度,亮度为 0 时是黑色,亮度为 255 时可能是最亮的颜色。取值范围同样是 0 - 255。
作用
HSV 颜色空间转换在图像处理中有诸多重要作用,特别是在颜色识别和分割方面:
- 颜色识别更方便:相比于 BGR 颜色空间,HSV 颜色空间更容易通过调整色调、饱和度和亮度的范围来识别特定颜色。例如,要识别图像中的蓝色物体,在 HSV 颜色空间中可以更准确地定义蓝色的范围。
- 光照变化鲁棒性强:亮度分量独立于颜色信息,因此在光照变化的情况下,通过调整亮度分量,可以减少光照对颜色识别的影响。
# HSV 颜色空间
def test004():img = cv2.imread("./opencv_work/src/demo.png")hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)cv2.imshow("img1", img)cv2.imshow("img_hsv", hsv)cv2.waitKey(0)
该代码将一张彩色图像从 BGR 颜色空间转换为 HSV 颜色空间,并显示原始图像和转换后的图像。
原图:
转换后的图像:
6. 查找颜色范围对应的像素点
在图像处理里,查找颜色范围对应的像素点指的是在图像里找出处于特定颜色范围的像素,这一操作常被用于颜色识别与分割任务。借助把图像从 BGR 颜色空间转换到 HSV 颜色空间,能更便捷、精准地定义颜色范围。
# 查找颜色范围对应的像素点
def test005():img = cv2.imread("./opencv_work/src/demo.png")hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)lower_blue = np.array([100, 43, 46])upper_blue = np.array([124, 255, 255])mask = cv2.inRange(hsv, lower_blue, upper_blue)cv2.imshow("img", img)cv2.imshow("mask", mask)cv2.waitKey(0)
此代码在 HSV 颜色空间中查找蓝色范围内的像素点,并生成一个掩膜图像,最后显示原始图像和掩膜图像。
掩膜:
7. 与运算 - 生成掩膜
掩膜(Mask):是一个二值图像,其中像素值为 255(白色)的区域表示我们感兴趣的区域,而像素值为 0(黑色)的区域表示我们不感兴趣的区域。
与运算(Bitwise AND):在图像处理里,与运算是对两个图像的对应像素进行逐位逻辑与操作。当两个对应像素都为非零值时,结果像素为非零值;否则,结果像素为零。
# 与运算-生成掩膜
def test006():img = cv2.imread("./opencv_work/src/demo.png")hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)lower = np.array([0, 43, 46])upper = np.array([10, 255, 255])mask = cv2.inRange(hsv, lower, upper) # hsv 的颜色范围# img1[img_mask==255]=[255,0,0] #把掩膜中为 255 的下标对应位置的原图像的颜色改了bit = cv2.bitwise_and(img, img, mask=mask)cv2.imshow("img", img)cv2.imshow("mask", mask)cv2.imshow("bit", bit)cv2.waitKey(0)
这段代码通过与运算生成一个掩膜,并将掩膜应用到原始图像上,最后显示原始图像、掩膜图像和处理后的图像。
处理后的图像:
8. 添加水印
在图像处理中,添加水印是一种常见的操作,用于保护图像版权、标识来源等。
# 添加水印
def test007():# 读取背景图像img = cv2.imread("./opencv_work/src/view.png")# 读取水印图像img1 = cv2.imread("./opencv_work/src/logo.png")# 获取水印图像的高度、宽度和通道数h, w, c = img1.shape# 选取背景图像上放置水印的感兴趣区域(ROI)roi_img = img[100:100 + h, 100:100 + w] # 共享的内存# 将水印图像转换为灰度图logo_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)# 通过二值化得到黑化的水印(文字部分为黑色,背景为白色)_, black_logo = cv2.threshold(logo_gray, 150, 255, cv2.THRESH_BINARY)# 通过二值化得到白化的水印(文字部分为白色,背景为黑色)_, white_logo = cv2.threshold(logo_gray, 150, 255, cv2.THRESH_BINARY_INV)# 抠出水印图中的文字(文字保留,其他部分黑化)logo2 = cv2.bitwise_and(img1, img1, mask=white_logo)# 抠出背景图中水印位置的文字(文字黑化,其他部分保留)roi_img2 = cv2.bitwise_and(roi_img, roi_img, mask=black_logo)# 将抠出的水印文字和背景图的 ROI 部分相加img_rh = cv2.add(logo2, roi_img2)# 因为内存共享,所以修改 ROI 区域相当于修改原图roi_img[::] = img_rh# 显示相关图像,方便观察处理过程cv2.imshow("logo2", logo2)cv2.imshow("roi_img2", roi_img2)cv2.imshow("img_rh", img_rh)cv2.imshow("img", img)cv2.imshow("img1", img1)cv2.imshow("roi_img", roi_img)cv2.waitKey(0)if __name__ == "__main__":test007()
该代码实现了在图像上添加水印的功能,通过二值化、与运算和加法操作,将水印添加到原始图像的指定区域。
效果图:
9. 主函数
if __name__ == "__main__":# test001()# test002()# test003()# test004()# test005()# test006()test007()
在主函数中,你可以根据需要调用不同的测试函数。
总结
通过以上代码示例,我们展示了如何使用 OpenCV 进行多种图像操作,包括图像加法、颜色加权加法、HSV 颜色空间转换、颜色范围查找、与运算生成掩膜以及添加水印等。这些操作在计算机视觉和图像处理中非常常见,希望本文能对你有所帮助。