OpenCV-Python图像颜色变换

深碍√TFBOYSˉ_ 2022-09-14 02:20 312阅读 0赞

给图像添加颜色

在使用OpenCV操作图像时,有时候需要给图像添加不同的颜色,以达到不同的风格效果。这里介绍的主要是opencv中的cv.applyColorMap()函数。

  • 给图像应用颜色函数cv.applyColorMap(src, colormap, dst=None)
    src:表示传入的原图;
    colormap:颜色图类型(17种)。可以单独使用,也可以以一个列表的形式批量使用。

以下图举例实现:
在这里插入图片描述
直接上代码:

  1. # -*-coding:utf-8-*-
  2. """
  3. File Name: color_operation.py
  4. Program IDE: PyCharm
  5. Create File By Author: Hong
  6. """
  7. import cv2 as cv
  8. import numpy as np
  9. color_map = [
  10. cv.COLORMAP_AUTUMN,
  11. cv.COLORMAP_BONE,
  12. cv.COLORMAP_JET,
  13. cv.COLORMAP_WINTER,
  14. cv.COLORMAP_PARULA,
  15. cv.COLORMAP_OCEAN,
  16. cv.COLORMAP_SUMMER,
  17. cv.COLORMAP_SPRING,
  18. cv.COLORMAP_COOL,
  19. cv.COLORMAP_PINK,
  20. cv.COLORMAP_HOT,
  21. cv.COLORMAP_PARULA,
  22. cv.COLORMAP_MAGMA,
  23. cv.COLORMAP_INFERNO,
  24. cv.COLORMAP_PLASMA,
  25. cv.COLORMAP_TWILIGHT,
  26. cv.COLORMAP_TWILIGHT_SHIFTED
  27. ]
  28. def color_operation(image_path: str):
  29. img = cv.imread(image_path, cv.IMREAD_COLOR) # 以彩色模式读图像
  30. cv.namedWindow('input', cv.WINDOW_AUTOSIZE) # 根据图像大小自动调节窗口大小
  31. cv.imshow('input', img)
  32. index = 0
  33. while True:
  34. dst = cv.applyColorMap(img, color_map[index % len(color_map)]) # 在原图上应用不同的颜色模式
  35. cv.imshow('{}'.format(color_map[index % len(color_map)]), dst)
  36. index += 1
  37. c = cv.waitKey(1000)
  38. if c == 27:
  39. break
  40. cv.destroyAllWindows()
  41. if __name__ == '__main__':
  42. path = 'images/daiyutong.png'
  43. color_operation(path)

效果展示:
在这里插入图片描述

图像按位操作

图像的位级操作主要包括:与、或、非、异或四种操作。

  • 与:cv.bitwise_and(img1,img2),两幅图像按位进行与操作;
  • 或:cv.bitwise_or(img1, img2),两幅图像按位进行或操作;
  • 异或:cv.bitwise_xor(img1, img2),两幅图像按位进行异或操作;
  • 非:cv.bitwise_not(img),将图像按位取反操作。

具体代码如下:

  1. # -*-coding:utf-8-*-
  2. """
  3. File Name: color_operation.py
  4. Program IDE: PyCharm
  5. Create File By Author: Hong
  6. """
  7. import cv2 as cv
  8. import numpy as np
  9. def bitwise_operation(image_path1: str, image_path2: str):
  10. img1 = cv.imread(image_path1, cv.IMREAD_COLOR)
  11. img2 = cv.imread(image_path2, cv.IMREAD_COLOR)
  12. img2 = cv.resize(img2, (300, 300))
  13. # img1 = np.zeros((400, 400, 3), dtype=np.uint8) # 创建一个空白图像
  14. # img1[:, :] = (255, 0, 255) # 给所有像素的b和r通道赋值
  15. # img2 = np.zeros((400, 400, 3), dtype=np.uint8)
  16. # img2[:, :] = (0, 255, 0) # 给所有像素的g通道赋值
  17. dst1 = cv.bitwise_and(img1, img2) # 图像的与操作
  18. dst2 = cv.bitwise_or(img1, img2) # 图像的或操作
  19. dst3 = cv.bitwise_xor(img1, img2) # 图像的异或操作
  20. dst4 = cv.bitwise_not(img1) # 图像的非操作
  21. cv.imshow('img1', img1)
  22. cv.imshow('img2', img2)
  23. cv.imshow('bitwise_and', dst1)
  24. cv.imshow('bitwise_or', dst2)
  25. cv.imshow('bitwise_xor', dst3)
  26. cv.imshow('bitwise_not', dst4)
  27. cv.waitKey(0)
  28. cv.destroyAllWindows()
  29. if __name__ == '__main__':
  30. path1 = 'images/daiyutong.png'
  31. path2 = 'images/2.png'
  32. bitwise_operation(path1, path2)

结果展示:
在这里插入图片描述

图像的通道操作

彩色图像由R、G、B三通道组成,我们可以分别对每个通道进行操作。主要有通道分离、通道合并、通道交换等操作。

  • 通道分离:cv.split(img)
  • 通道合并:cv.merge(mv)
  • 通道交换:cv.mixChannels(src, dst, fromTo)

代码实现:

  1. # -*-coding:utf-8-*-
  2. """
  3. File Name: color_operation.py
  4. Program IDE: PyCharm
  5. Create File By Author: Hong
  6. """
  7. import cv2 as cv
  8. import numpy as np
  9. def channel_operation(image_path: str):
  10. img = cv.imread(image_path, cv.IMREAD_COLOR)
  11. cv.namedWindow('input', cv.WINDOW_AUTOSIZE)
  12. cv.imshow('input', img) # 彩色图像,3个通道,每个通道都是H×W。
  13. # 通道分离
  14. mv = cv.split(img)
  15. print('mv[0]', mv[0]) # 图像的b通道
  16. print('mv[1]', mv[1]) # 图像的g通道
  17. print('mv[2]', mv[2]) # 图像的r通道
  18. mv[0][:, :] = 255 # 给b通道上的所有像素值全部赋值为255
  19. # 通道合并
  20. result = cv.merge(mv)
  21. # 通道交换
  22. dst = np.zeros(img.shape, dtype=np.uint8)
  23. cv.mixChannels([img], [dst], fromTo=[2, 0, 1, 1, 0, 2])
  24. out = cv.cvtColor(img, cv.COLOR_BGR2RGB) # 与上面的通道交换bgr->rgb结果类似,
  25. cv.imshow('bbb', img[:, :, 0]) # 显示第1个通道
  26. cv.imshow('ggg', img[:, :, 1]) # 显示第2个通道
  27. cv.imshow('rrr', img[:, :, 2]) # 显示第3个通道
  28. cv.imshow('result', result)
  29. cv.imshow('dst', dst)
  30. cv.imshow('out', out)
  31. cv.waitKey(0)
  32. cv.destroyAllWindows()
  33. if __name__ == '__main__':
  34. path = 'images/daiyutong.png'
  35. channel_operation(path)

结果展示:
在这里插入图片描述
获取更多计算机视觉知识,请关注微信公众号 “AI与计算机视觉”。

发表评论

表情:
评论列表 (有 0 条评论,312人围观)

还没有评论,来说两句吧...

相关阅读