文章目录
- 图像处理入门100题之通道交换
- 前言
- 问题一:通道交换
- 代码实现:
- 1.准备工作
- 2.通道交换
- 总结
前言
这是一个新的专题!
题来自于「画像処理100本ノック」中文版本!为图像处理初学者设计的 100 个问题。
在这里我们可以学到:
1、Python的第三方库OpenCV和matplotlib的基本用法
2、数字图像处理的基本算法
问题一:通道交换
读取图像,然后将通道替换成通道。
原始图片可以在上面的GitHub链接里找到。
代码实现:
1.准备工作
我们将通过OpenCV和matplotlib不同的库加载原始图片:
# matplotlib
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
image = mpimg.imread('imori.jpg') #读取图片
plt.title('Read Image by Matplotlib')
plt.axis('off') # 不显示坐标轴
plt.imshow(image) #显示图片
plt.show()
结果展示:
import cv2 # 导入OpenCV库,注意这里库的引用名,它不是as cv2 而直接是import cv2
img = cv2.imread("imori.jpg") # 读取图片
cv2.namedWindow("Read Image by OpenCV",0)
cv2.resizeWindow("Read Image by OpenCV", 300, 300) # 以上两行代码能够定义打开图片窗口的尺寸以及位置
cv2.imshow("Read Image by OpenCV",img) # 展示图片
cv2.waitKey(0) # waitKey的参数为0时,展示图片的窗口一直保持
cv2.destroyAllWindows() # 关闭图片展示窗口
结果展示:
2.通道交换
代码如下(示例):
import cv2
# function: BGR -> RGB
def BGR2RGB(img):
b = img[:, :, 0].copy() # 这里要说明的是OpenCV读取图片通道的顺序是b、g、r,为什么上面使用opencv展示图片时色彩也是正常rgb顺序呢,因为OpenCV不仅读取是bgr顺序,展示时也是,因此显示是正常的
g = img[:, :, 1].copy()
r = img[:, :, 2].copy()
# RGB > BGR
img[:, :, 0] = r
img[:, :, 1] = g
img[:, :, 2] = b
return img
# Read image
img = cv2.imread("imori.jpg")
# BGR -> RGB
img = BGR2RGB(img)
# Save result
cv2.imwrite("out.jpg", img)
cv2.namedWindow("result",0)
cv2.resizeWindow("result", 300, 300)
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果展示:
总结
关于第一个问题没有过多的算法思想要交代的,说说一些小细节:
copy()语法需要注意的是深浅复制之分的理解;
OpenCV的图片通道读取顺序是B、G、R,matplotlib读取的顺序是R、G、B,而计算机存储顺序与OpenCV相同,因此cv.imshow()直接可以把原图片展示出来,plt.imshow()需要在读取之后做一个通道的转换;
最后一点要说的是函数名的定义,作者的函数名还是很值得玩味的,BGR2RGB,我发现在CV库中也有大量的类似命名规律,两个英文之间有一个数字2,后来经过思考,发现2的英文是two,与to同音,类似的函数方法都是一个形式到另一种形式的转换,也就是to操作;
最后提一句,为了写博客好截图,在作者的源代码中加了两句代码,这样OpenCV生成的图片显示窗口就可以移动了,且窗口大小可调整