问题描述:给出一幅彩色图像和一张mask二值图像,其中mask和彩色图像大小相同,感兴趣的部分为1,其余部分为0,请用mask与彩色图像点乘,将感兴趣区域显示出来。
点乘的本质是mask中是二值图像,感兴趣部分像素值为1,将彩色图像与mask对应像素相乘,感兴趣区域的的像素保持不变,其余的像素点为0,从而显示感兴趣区域。
首先彩色图像是不能与二值图像直接进行点乘的,因为矩阵的维度都不一样。
这里有两种方法可以实现如上功能:将彩色图像按通道进行点乘,再合并起来,或者将二值图像复制扩充为三通道图像,再与彩色图像直接进行点乘。
复制扩充的意思是,图像有三个通道,应该让mask的三个通道都有感兴趣区域,不能也不能简单的将其他通道置为0,否则只会显示一个通道的彩色图像,B或G或R
Matlab
假设mask矩阵的大小为a(200,300),展示的是200*300的二值图像,原图大小为m(200,300,3),表示200*300的三通道彩色图像。
%假设输出图像为c %按通道进行点乘 c(:,:,1)=m(:,:,1).*a; c(:,:,2)=m(:,:,2).*a; c(:,:,3)=m(:,:,3).*a;
%先将二值图像进行复制扩充 %假设三通道mask为p p(:,;,1)=a; p(:,;,2)=a; p(:,;,3)=a; c=m.*p;
C++
OpenCV中的位与函数为bitwise_and,表示对应的像素点相与,另外mask的复制扩充及分通道,合并通道可以看:Scalar、图像通道、分离、合成通道