1,图像通道的拆分(cv2.split)
函数 cv2.split() 将 3 通道 BGR 彩色图像分离为 B、G、R 单通道图像。
函数说明:
cv2.split(img, mv) -> mv # 图像拆分为 BGR 通道
函数 cv2.split() 传入一个图像数组,并将图像拆分为 B/G/R 三个通道。
参数说明:
img:图像数据,nparray 多维数组
mv:指定的分拆通道(可选)
注意事项:
对于 openCV 使用的 BGR 格式图像,返回的分拆通道的次序为 B、G、R 通道。
BGR 彩色图像的数据形状为 (width, height, channels=3),返回的 B/G/R 通道的数据形状为 (width, height),不能按照 BGR 彩色图像直接显示。
如果直接用 imshow 显示返回的单通道对象,将被视为 (width, height) 形状的灰度图像显示。
如果要正确显示某一颜色分量,需要增加另外两个通道值(置 0)转换为 BGR 三通道格式,再用 imshow 才能显示为拆分通道的颜色。
cv2.split() 操作复杂耗时
代码示例:
将一个三通道的图像,通过split API进行通道分离,存储到一个vector中;
Mat src = imread("F:/code/images/test.png");//3通道彩色图像
if (src.empty()) {
printf("fail to read");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//通道分离
vector<Mat> mv;
split(src, mv);
int size = mv.size();
printf("channels:%d", size);//size = 3
imshow("blue channel", mv[0]);//b channel
imshow("green channel", mv[1]);//g channel
imshow("red channel", mv[2]);//r chanel
2,函数 cv2.merge() 将 B、G、R 单通道合并为 3 通道 BGR 彩色图像。
函数说明:
cv2.merge(mv, dst) -> dst # BGR 通道合并
参数说明:
mv:要合并的单通道
dst:通道合并的图像,nparray 多维数组
注意事项:
进行合并的 B、G、R 单通道图像分量,数据形状必须为 (width, height),而不是形状为 (width, height, channels=3) 的蓝色/绿色/红色图像。
单通道图像分量的图像大小 (width, height) 必须相同才能进行合并。
颜色通道要按照 B、G、R 通道次序合并,才能得到 BGR 格式的合并结果。
cv2.merge() 操作复杂耗时.
代码示例:
通过分离得到的每一个通道,都可以进行像素修改等操作,然后可以通过 merge API将分离后的各通道进行合并
//通道合并
mv[2] = Scalar(0);
Mat dst;
merge(mv, dst);
imshow("merge", dst);
3,ROI :感兴趣区域
通过设置矩形,获取图像的感兴趣区域
PS: sub = src(roi) 为浅拷贝,sub和src(roi)为相同内存地址,因此对于sub的修改会同步到src中;sub = src(roi).clone()为深拷贝,对应不同的内存空间,因此不会相互影响
//ROI
Rect roi;
roi.x = 100;
roi.y = 100;
roi.width = 250;
roi.height = 250;
//Mat sub = src(roi);
Mat sub = src(roi).clone();//深拷贝
bitwise_not(sub, sub);//非操作
rectangle(src, roi, Scalar(0, 255, 0), 1, LINE_AA);//在src上画矩形框
imshow("sub", sub);
imshow("input", src);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/182021.html