OpenCV4.8 开发实战系列专栏之 08 - 通道分离与合并
大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。
专栏代码全部基于C++ 与Python双语演示,专栏答疑群 请联系微信 OpenCVXueTang_Asst
本文关键知识点:
OpenCV中默认imread函数加载图像文件,加载进来的是三通道彩色图像,色彩空间是RGB色彩空间、通道顺序是BGR(蓝色、绿色、红色)、对于三通道的图像OpenCV中提供了两个API函数用以实现通道分离与合并。
- split // 通道分类
- merge // 通道合并
扩展一下:
在很多CNN的卷积神经网络中输入的图像一般会要求[h, w, ch]其中h是高度、w是指宽度、ch是指通道数数目、OpenCV DNN模块中关于图像分类的googlenet模型输入[224,224,3]表示的就是224x224大小的三通道的彩色图像输入。
更正一下代码里面的内容关于mixchannels的 Python版本用法,参考如下代码即可:
dst = np.zeros(src.shape, dtype=np.uint8)
print(src.shape)
print(dst.shape)
cv.mixChannels([src], [dst], fromTo=[2, 0, 1, 1, 0, 2])
cv.imshow("output4", dst)
解释:
- mixchannels使用前必须先分配好np图像对象
- 前两个参数是图像数组!
在图像处理领域,通道分离(split)与合并(merge)是两个基础且重要的操作,它们允许对图像的各个颜色通道进行单独处理或修改。以下是对这两个操作的详细解释:
通道分离(split)
通道分离是指将彩色图像分解成其组成的单个颜色通道。在大多数图像处理库中,如OpenCV,彩色图像通常表示为三个通道的集合:红色(R)、绿色(G)和蓝色(B),尽管在某些情况下也可能使用其他色彩空间(如HSV或YUV),但BGR是最常见的。
- 功能:使用split函数可以将彩色图像分成R、G、B三个单通道图像,从而方便对这三个通道分别进行操作。
- 示例:在OpenCV中,可以使用
cv.split(src)
函数来实现通道分离,其中src
是需要分离通道的图像数组。分离后,会得到三个单独的数组,分别代表R、G、B三个通道。 - 注意事项:通道分离是一个比较耗时的操作,因此应在真正需要时才使用。如果只需要修改多通道图像中的某个通道的值,可以考虑使用numpy等库直接操作数组,而不是进行通道分离。
通道合并(merge)
通道合并是指将分离后的单个颜色通道重新组合成一个彩色图像。这个过程是通道分离的逆操作。
- 功能:使用merge函数可以将多个单通道图像合并成一个多通道图像。在OpenCV中,这通常用于将R、G、B三个通道重新组合成一个彩色图像。
- 示例:在OpenCV中,可以使用
cv.merge([b, g, r])
函数来实现通道合并,其中b
、g
、r
分别是代表蓝色、绿色和红色通道的数组。合并后,会得到一个新的彩色图像数组。 - 应用场景:通道合并常用于图像处理中的多种场景,如图像增强、色彩校正、图像合成等。通过修改分离后的通道并重新合并,可以实现各种图像效果。
总结
通道分离与合并是图像处理中的基础操作,它们允许对图像的各个颜色通道进行单独处理或修改。这些操作在图像增强、色彩校正、图像合成等领域具有广泛的应用价值。在使用这些操作时,需要注意它们的性能和资源消耗,并根据具体需求选择适当的处理方法。
演示代码
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, const char *argv[])
{Mat src = imread("D:/vcprojects/images/flower.png");if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input", WINDOW_AUTOSIZE);imshow("input", src);vector<Mat> mv;Mat dst1, dst2, dst3;// 蓝色通道为零split(src, mv);mv[0] = Scalar(0);merge(mv, dst1);imshow("output1", dst1);// 绿色通道为零split(src, mv);mv[1] = Scalar(0);merge(mv, dst2);imshow("output2", dst2);// 红色通道为零split(src, mv);mv[2] = Scalar(0);merge(mv, dst3);imshow("output3", dst3);waitKey(0);return 0;
}
python 代码演示
import cv2 as cvsrc = cv.imread("D:/vcprojects/images/flower.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)# 蓝色通道为零
mv = cv.split(src)
mv[0][:, :] = 0
dst1 = cv.merge(mv)
cv.imshow("output1", dst1)# 绿色通道为零
mv = cv.split(src)
mv[1][:, :] = 0
dst2 = cv.merge(mv)
cv.imshow("output2", dst2)# 红色通道为零
mv = cv.split(src)
mv[2][:, :] = 0
dst3 = cv.merge(mv)
cv.imshow("output3", dst3)cv.mixChannels(src, dst3, [2, 0])
cv.imshow("output4", dst3)cv.waitKey(0)
cv.destroyAllWindows()
结束语
学习贵在坚持,学习OpenCV贵在每一天的代码练习,原理跟基本的函数解释,相关知识,后续更新边学边理解,搞技术永远要坚持做长期主义者!我们一起努力!!!
专栏答疑群 请联系微信 OpenCVXueTang_Asst