Python图像处理入门100题之通道交换

图像处理入门100题之通道交换


前言

这是一个新的专题!

题来自于「画像処理100本ノック」中文版本!为图像处理初学者设计的 100 个问题。

在这里我们可以学到:
1、Python的第三方库OpenCV和matplotlib的基本用法
2、数字图像处理的基本算法


问题一:通道交换

读取图像,然后将 RGB \text{RGB} RGB通道替换成 BGR \text{BGR} BGR通道。

原始图片
原始图片可以在上面的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生成的图片显示窗口就可以移动了,且窗口大小可调整

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值