上一篇博客,我们学习了如何通过更快的item()和itemset()的方法访问图片,以及了解了图像的兴趣位置的获取方法,那么今天,我们将学习通道的处理方法,通过通道的拆分和合并的实例,让大家更好的了解咱们有关于BGR通道的知识。
文章大纲
- 通道获取
- Split() 方法
- 索引法
- 更改通道
- 通道合并
- merge() 函数
- 每日总结
通道获取
Split() 方法
在OpenCV中,可以使用split()方法将图像的不同通道拆分为单独的Mat对象。该方法接收一个原始图像的Mat对象并返回一个包含所有通道的向量,每个通道都保存为单独的Mat对象。以下是通道拆分的示例代码:
import cv2
# 读取图像
img = cv2.imread("LFS.jpg")
# 将图像的不同通道拆分为单独的Mat对象
B, G, R = cv2.split(img)
# 显示单个通道的图像
cv2.imshow("Blue Channel", B)
cv2.imshow("Green Channel", G)
cv2.imshow("Red Channel", R)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例代码中,我们首先读取一张图像,然后使用split()方法将其拆分为Blue、Green和Red通道,并将每个通道分别保存为单独的Mat对象。接下来,我们显示每个通道的图像并等待用户按下任意按键以关闭窗口。
索引法
还有一个更加原始的方法就是像我们之前处理图片所用的索引法一样,来进行各个通道之间的分离。
import cv2
# 读取图像
img = cv2.imread("COLOR_LFS.jpg")
# 索引分离
B = img[:,:,0]
G = img[:,:,1]
R = img[:,:,2]
# 显示单个通道的图像
cv2.imshow("Blue Channel", B)
cv2.imshow("Green Channel", G)
cv2.imshow("Red Channel", R)
cv2.waitKey(0)
cv2.destroyAllWindows()
显示出来的结果和之前一样,都是分离了三个的界面哦~
更改通道
通道修改可用于根据不同通道之间的差异来分割图像或提取感兴趣的对象。例如,可以通过比较红色通道和绿色通道的差异来分割红色物体,或者通过计算梯度来提取边缘信息。
我们上手进行尝试。
我们仍然使用索引法,将绿色通道的数据复制到蓝色通道上去。
import cv2
# 读取图像
img = cv2.imread("COLOR_LFS.jpg")
cv2.imshow("Origin Image", img)
# 索引变换 蓝色通道改成绿色通道
img[:,:,0] = img[:,:,1]
# 显示通道的图像
cv2.imshow("Change Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们可以看到,原本蓝色的天变成了绿色的天。
通道合并
merge() 函数
在OpenCV中,可以使用merge()方法将多个Mat对象合并为一个多通道的Mat对象。该方法接受一个包含多个单通道Mat对象的向量,并返回一个多通道的Mat对象。以下是merge()方法的示例代码:
import cv2
# 读取图像
img = cv2.imread("COLOR_LFS.jpg")
# 将图像的不同通道拆分为单独的Mat对象
B, G, R = cv2.split(img)
# 合并单个通道的图像为多通道的图像
merged_img = cv2.merge([B, G, R])
# 显示合并后的图像
cv2.imshow("Merged Image", merged_img)
print(merged_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的示例代码中,我们首先读取一张图像,然后使用split()方法将其拆分为Blue、Green和Red通道,并将每个通道分别保存为单独的Mat对象。接下来,我们使用merge()方法将这三个单通道的Mat对象合并为一个多通道的Mat对象。最后,我们显示合并后的图像并等待用户按下任意按键以关闭窗口。
那么以上是正常的组合,那加入我们用错误的组合方式会怎么样呢?
import cv2
# 读取图像
img = cv2.imread("COLOR_LFS.jpg")
# 将图像的不同通道拆分为单独的Mat对象
B, G, R = cv2.split(img)
# 合并单个通道的图像为多通道的图像
correct_img = cv2.merge([B, G, R])
wrong_img_1 = cv2.merge([G,B,R])
wrong_img_2 = cv2.merge([R,G,B])
# 显示合并后的图像
cv2.imshow("CORRECT Image", correct_img)
cv2.imshow("WRONG Image 1", wrong_img_1)
cv2.imshow("WRONG Image 2", wrong_img_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们可以很明显地看到,图片的颜色发生了变化
每日总结
今天我们学习了使用split()
方法分离每一个通道,以及索引的[:,:,num]
的方法分离。我们还学习了融合通道的merge[a,b,c]
的方法。那么我们下一篇文章再见~