使用ColorMap在MatLab中将图像中的黄色对象更改为绿色

时间:2018-09-27 19:12:06

标签: matlab image-processing

我对MatLab还是很陌生,正在参加一门选修课程,该课程要求在我修读MBA时需要MatLab(是的,完全不同的领域)。作为分配的一部分,我们必须使用MatLab颜色映射将下图中的黄色对象转换为绿色:

avocado_image

我已经使用了“ imread”功能并将其导入到Matlab中。我在Matlab上使用颜色图也有一些经验,但是很基础。在提供的提示中,据说我应该使用IMTOOL函数来确定黄色像素和背景像素的r,g,b值的范围。我应该设计一种颜色映射算法,将黄色对象转换为绿色,但完全不触摸任何背景。

在我之前的练习中,我们将255的值除以255,将其转换为1s和0s。然后,我们创建了一个新的颜色图,并应用了它来转换颜色。但是我仍然不知道如何将所有这些结合在一起。我已经尝试过从Matlab帮助中找到的一些代码,但是我什么也没找到。我的方法是将图像导入Matlab,读取图像矩阵。对于接近黄色像素的所有像素,我将其替换为通用绿色像素。有一个更好的方法吗?如果没有,我该如何用简单的MatLab代码来做到这一点?

此外,我已经检查了此函数中的代码,并且我有10000000%的人确定他们问我的内容不必这么复杂:https://www.mathworks.com/matlabcentral/fileexchange/26420-simplecolordetection

根据要求,这是我到目前为止的代码。据我所知,它是C和MatLab的混合体,我做了一个快速而肮脏的C for循环来做到这一点,现在正尝试将其转换为MatLab:

for i = 1: image.columnlength
for j = 1: image.rowlenght

    rgb =  image(i, j);
    red = rgb(:,1); %rgb(1,:);
    green = rgb(:,2);%rgb(2,:);
    blue = rgb(:,3);%rgb(3,:);
    if( red > 200 && red < 250 && green > 200 && green < 250 && blue > 200 && blue < 250 
            //image(i, j ) = green

    end
 end
end

谢谢, 史蒂夫

1 个答案:

答案 0 :(得分:0)

我觉得您想要的很多东西已经内置。不幸的是,我不了解您的if条件。如果每个颜色值都在200到250之间,则您希望像素为绿色,对吗?我只是尝试过,但没有适合该条件的像素。我尝试了其他一些值,然后它开始工作,但是您必须检查您确切想要的wichi区域:

imdata = imread('pic.jpg');

for i=1:size(imdata,1)
    for j=1:size(imdata,2)
        %'...' is just a code-linebreak in matlab for readability
        if  imdata(i,j,1)>150 && imdata(i,j,1)<250 && imdata(i,j,1)>200 && ...
            imdata(i,j,1)<250 && imdata(i,j,3)>100 && imdata(i,j,3)<250
            %lets say your green is [50,200,0]
            imdata(i,j,1)=50;
            imdata(i,j,2)=200;
            imdata(i,j,3)=0;
        end
    end
end

imshow(imdata)

changed colors 您可以选择其他逻辑条件,例如(imdata(i,j,1)<50 || imdata(i,j,1)>150)imdata(i,j,1)==150,也可以选择几乎任何其他条件。您也可以查看这些值以找到适合您的阈值

figure
subplot(2,2,1)
mesh(imdata(:,:,1)) %red
subplot(2,2,2)
mesh(imdata(:,:,2)) %green
subplot(2,2,3)
mesh(imdata(:,:,3)) %blue
subplot(2,2,4)  
imshow(imdata)

在Matlab中,我将尝试进行矩阵运算而不是遍历每个像素,但是这种解决方案更容易理解和重构。