我有一个从matlab中读入影像文件的图像。图像是一个3d数组。我如何通过这个图像,如果颜色大多是红色的(例如,红色> 200蓝色< 50绿色< 50) 使图像的一部分变黑并且其他区域变白?MATLAB:如何将图像数组转换为基于颜色的黑白数组?
最终我想为整个视频做这个,但我首先需要理解这一点!
我有一个从matlab中读入影像文件的图像。图像是一个3d数组。我如何通过这个图像,如果颜色大多是红色的(例如,红色> 200蓝色< 50绿色< 50) 使图像的一部分变黑并且其他区域变白?MATLAB:如何将图像数组转换为基于颜色的黑白数组?
最终我想为整个视频做这个,但我首先需要理解这一点!
单个RGB图像(3D矩阵)的基本情况下,已经显示出通过others:
img = imread('image.png'); %# some RGB image
img2 = ~(img(:,:,1)>200 & img(:,:,2)<50 & img(:,:,3)<50);
如果您想要将其应用于所有帧电影(4D-矩阵=高度逐宽度逐色接一帧),尝试以下紧凑的解决方案:
mov = cat(4, img, img); %# a sample video of two frames
mov2 = squeeze(~(mov(:,:,1,:)>200 & mov(:,:,2,:)<50 & mov(:,:,3,:)<50));
img = imread('image.jpg');
r = img(:,:,1);
g = img(:,:,2);
b = img(:,:,3);
iR = r > 200;
iG = g < 50;
iB = b < 50;
img2 = 255*ones([size(img,1) size(img,2)],'uint8');
img2(iR & iG & iB) = 0;
subplot(2,1,1), imshow(img)
subplot(2,1,2), imshow(img2)
对于存储器和速度问题,可以更换相关的行,如下所示:
img2 = true([size(img,1) size(img,2)]);
img2(iR & iG & iB) = false;
谢谢!现在还有一件事我明白你是如何做到这一点的。你能提出将这个应用到整个电影文件的方法吗?你是否必须逐帧阅读电影,将其应用于所有帧,然后将它们一起加入到另一部电影中? –
@ Phoen1xUK:我添加了一个解决方案来演示如何将它应用到整个电影矩阵 – Amro
@ Phoen1xUK:如果您的视频尺寸不是很大,Amro的解决方案可能会帮助您。但是,如果您想处理大型视频以适应内存,则可以检查VideoReader(http://www.mathworks.com/help/techdoc/import_export/f5-132080.html#f5-146610)以加载视频所需的部分存储和处理,如在Amro的解决方案或逐帧。 – petrichor
类似的问题:http://stackoverflow.com/questions/4063965/how-可以将图像转换为灰度 - 但保持单色/ – Amro