【问题标题】:Using ColorMap to Change Yellow Object in Image to Green in MatLab在 MatLab 中使用 ColorMap 将图像中的黄色对象更改为绿色
【发布时间】:2018-09-27 19:12:06
【问题描述】:

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

avocado_image

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

在我之前的练习中,我们通过除以 255 将 255 值转换为 1 和 0。然后我们创建了一个新的颜色图并应用它来转换颜色。但我仍然不知道如何将这一切结合在一起。我尝试了一些从 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

谢谢, 史蒂夫

【问题讨论】:

  • 你能把你目前拥有的代码和你得到的结果包括进来吗?此外,看看this post 关于颜色选择可能会有所帮助。
  • 当然。这是我的代码,但它是 C 和 MatLab 的组合(我对 C 的理解有些好,但问题是尝试将其转换为 MatLab)。我实际上正在使用一种方法,我试图获得一系列黄色。我已将代码添加到主帖中。

标签: matlab image-processing


【解决方案1】:

我觉得很多你想要的东西已经内置了。不幸的是,我不明白你的 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)

您可以选择其他逻辑条件,例如 (imdata(i,j,1)&lt;50 || imdata(i,j,1)&gt;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 中,我会尝试进行矩阵运算,而不是遍历每个像素,但这种解决方案更容易理解和重构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2015-02-13
    • 2014-02-23
    • 2016-12-27
    • 2021-06-15
    • 2015-09-14
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多