如何将RGB图像转换为灰度,但保留一种颜色?

如何将RGB图像转换为灰度,但保留一种颜色?

我试图创造一个类似于罪恶之城或其他电影,他们删除所有的颜色,但一个从图像中删除。

我有一个RGB图像,我想转换为灰度,但我想保留一种颜色。

这是我的照片:

我想保留红色。剩下的应该是灰阶的。

到目前为止,这就是我的代码输出的内容(您可以看到这些区域是正确的,我不知道为什么它们是白色的,而不是红色的):

到目前为止,这是我的代码:

filename = 'roses.jpg';[cdata,map] = imread( filename );% convert to RGB if it is indexed imageif ~isempty( map ) 
   cdata = idx2rgb( cdata, map ); end%imtool('roses.jpg');imWidth = 685;imHeight = 428;% RGB ranges of a color we want to keepredRange
    = [140 255];greenRange = [0 40];blueRange = [0 40];% RGB values we don't want to convert to grayscaleredToKeep = 
    zeros(imHeight, imWidth);greenToKeep = zeros(imHeight, imWidth);blueToKeep = zeros(imHeight, imWidth);for x=1:imWidth

    for y=1:imHeight

        red = cdata( y, x, 1 );
        green = cdata( y, x, 2 );
        blue = cdata( y, x, 3 );

        if (red >= redRange(1) && red <= redRange(2) && green >= greenRange(1) && green <= greenRange(2) && blue >= blueRange(1) &
        & blue <= blueRange(2))
            redToKeep( y, x ) = red;
            greenToKeep( y, x ) = green;
            blueToKeep( y, x ) = blue;
        else
            redToKeep( y, x ) = 999;
            greenToKeep( y, x ) = 999;
            blueToKeep( y, x ) = 999;
        end

    end end im = rgb2gray(cdata);[X, map] = gray2ind(im);im = ind2rgb(X, map);for x=1:imWidth

    for y=1:imHeight

        if (redToKeep( y, x ) < 999)
            im( y, x, 1 ) = 240;
        end
        if (greenToKeep( y, x ) < 999)
            im( y, x, 2 ) = greenToKeep( y, x );
        end
        if (blueToKeep( y, x ) < 999)
            im( y, x, 3 ) = blueToKeep( y, x );
        end

    end end imshow(im);


喵喵时光机
浏览 954回答 3
3回答

慕仙森

figurepic&nbsp;=&nbsp;imread('EcyOd.jpg');for&nbsp;mm&nbsp;=&nbsp;1:size(pic,1) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;nn&nbsp;=&nbsp;1:size(pic,2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;pic(mm,nn,1)&nbsp;<&nbsp;80&nbsp;||&nbsp;pic(mm,nn,2)&nbsp;>&nbsp;80&nbsp;||&nbsp;pic(mm,nn,3)&nbsp;>&nbsp;100 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gsc&nbsp;=&nbsp;0.3*pic(mm,nn,1)&nbsp;+&nbsp;0.59*pic(mm,nn,2)&nbsp;+&nbsp;0.11*pic(mm,nn,3); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pic(mm,nn,:)&nbsp;=&nbsp;[gsc&nbsp;gsc&nbsp;gsc]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;&nbsp;endendimshow(pic)

小怪兽爱吃肉

一个大大提高图像质量的选择是转换到一个不同的颜色空间,以便更容易地选择您的颜色。特别是,HSV颜色空间定义像素颜色的色调(颜色)、饱和度(颜色的数量)和值(颜色的亮度)。例如,可以使用以下函数将rgb图像转换为hsv空间。rgb2hsv,查找具有要定义为“非红色”颜色的像素(例如,20到340度),将这些像素的饱和度设置为0(因此它们是灰度),然后使用该函数将图像转换回rgb空间。hsv2rgb:cdata&nbsp;=&nbsp;imread('EcyOd.jpg');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Load&nbsp;imagehsvImage&nbsp;=&nbsp;rgb2hsv(cdata);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&nbsp;Convert&nbsp;the&nbsp;image&nbsp;to&nbsp;HSV&nbsp;spacehPlane&nbsp;=&nbsp;360.*hsvImage(:,&nbsp;:,&nbsp;1);&nbsp;&nbsp;&nbsp;%&nbsp;Get&nbsp;the&nbsp;hue&nbsp;plane&nbsp;scaled&nbsp;from&nbsp;0&nbsp;to&nbsp;360sPlane&nbsp;=&nbsp;hsvImage(:,&nbsp;:,&nbsp;2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&nbsp;Get&nbsp;the&nbsp;saturation&nbsp;planenonRedIndex&nbsp;=&nbsp;(hPlane&nbsp;>&nbsp;20)&nbsp;&&nbsp;...&nbsp;&nbsp;%&nbsp;Select&nbsp;"non-red"&nbsp;pixels &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(hPlane&nbsp;<&nbsp;340);sPlane(nonRedIndex)&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Set&nbsp;the&nbsp;selected&nbsp;pixel&nbsp;saturations&nbsp;to&nbsp;0hsvImage(:,&nbsp;:,&nbsp;2)&nbsp;=&nbsp;sPlane;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Update&nbsp;the&nbsp;saturation&nbsp;planergbImage&nbsp;=&nbsp;hsv2rgb(hsvImage);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Convert&nbsp;the&nbsp;image&nbsp;back&nbsp;to&nbsp;RGB&nbsp;space下面是产生的图像:注意,与塞勒斯的溶液,你可以很容易地保持花上淡粉色的色调。还请注意,褐色色调的茎和地面也消失了。关于根据图像颜色属性从图像中选择对象的一个很酷的示例,您可以查看SteveEddins的博客文章。两个伙伴它描述了一种来自MathWorks的BrettShoelson的解决方案,用于从图像中提取一个“朋友”。关于选择颜色范围的注意事项.。另外一件可以帮助你选择颜色范围的事情是查看颜色的直方图。hPlane)出现在HSV图像的像素中。下面是一个使用函数的示例histc(或建议histcounts(如有的话)和bar:binEdges&nbsp;=&nbsp;0:360;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Edges&nbsp;of&nbsp;histogram&nbsp;binshFigure&nbsp;=&nbsp;figure();&nbsp;&nbsp; %&nbsp;New&nbsp;figure%&nbsp;Bin&nbsp;pixel&nbsp;hues&nbsp;and&nbsp;plot&nbsp;histogram:if&nbsp;verLessThan('matlab',&nbsp;'8.4') &nbsp;&nbsp;N&nbsp;=&nbsp;histc(hPlane(:),&nbsp;binEdges);&nbsp;&nbsp;%&nbsp;Use&nbsp;histc&nbsp;in&nbsp;older&nbsp;versions &nbsp;&nbsp;hBar&nbsp;=&nbsp;bar(binEdges(1:end-1),&nbsp;N(1:end-1),&nbsp;'histc');else &nbsp;&nbsp;N&nbsp;=&nbsp;histcounts(hPlane(:),&nbsp;binEdges); &nbsp;&nbsp;hBar&nbsp;=&nbsp;bar(binEdges(1:end-1),&nbsp;N,&nbsp;'histc');endset(hBar,&nbsp;'CData',&nbsp;1:360,&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Change&nbsp;the&nbsp;color&nbsp;of&nbsp;the&nbsp;bars&nbsp;using &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'CDataMapping',&nbsp;'direct',&nbsp;...&nbsp;&nbsp;%&nbsp;&nbsp;&nbsp;indexed&nbsp;color&nbsp;mapping&nbsp;(360&nbsp;colors) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'EdgeColor',&nbsp;'none');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;&nbsp;&nbsp;and&nbsp;remove&nbsp;edge&nbsp;coloringcolormap(hsv(360));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Change&nbsp;to&nbsp;an&nbsp;HSV&nbsp;color&nbsp;map&nbsp;with&nbsp;360&nbsp;pointsaxis([0&nbsp;360&nbsp;0&nbsp;max(N)]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Change&nbsp;the&nbsp;axes&nbsp;limitsset(gca,&nbsp;'Color',&nbsp;'k');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Change&nbsp;the&nbsp;axes&nbsp;background&nbsp;colorset(hFigure,&nbsp;'Pos',&nbsp;[50&nbsp;400&nbsp;560&nbsp;200]);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Change&nbsp;the&nbsp;figure&nbsp;sizexlabel('HSV&nbsp;hue&nbsp;(in&nbsp;degrees)');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Add&nbsp;an&nbsp;x&nbsp;labelylabel('Bin&nbsp;counts');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%&nbsp;Add&nbsp;a&nbsp;y&nbsp;label下面是得到的像素颜色直方图:注意原始图像是如何包含红色、绿色和黄色像素的(有几个橙色像素)。几乎没有青色、蓝色、靛蓝色或品红色像素。还请注意,我在上面选择的范围(20到340度)很好地排除了大部分不是两端两个大的红色星系团的一部分的东西。

开满天机

我真的不知道MATLAB是如何工作的,所以我不能对代码进行评论,但这可能有助于解释RGB颜色是如何工作的。当使用RGB颜色时,可以通过确保R、G和B的值都相同来确定灰度。因此,基本上您想要做的是检测一个像素是否是红色的,当不只是使R、G和B相同时(您可以使用3的平均值来表示一个基本的结果)。更难的部分是如何检测一个像素是否实际上是红色的,您不能仅仅检查一个像素在R值中是否高,因为它仍然可以是另一种颜色,而低的R值只意味着更深的红色。所以您可以这样做:(我没有MATLAB,所以假设语法):red&nbsp;=&nbsp;cdata(&nbsp;y,&nbsp;x,&nbsp;1&nbsp;); green&nbsp;=&nbsp;cdata(&nbsp;y,&nbsp;x,&nbsp;2&nbsp;); blue&nbsp;=&nbsp;cdata(y,&nbsp;x,&nbsp;3); if&nbsp;(red&nbsp;<&nbsp;(blue&nbsp;*&nbsp;1.4)&nbsp;||&nbsp;red&nbsp;<&nbsp;(green&nbsp;*&nbsp;1.4)&nbsp;) { &nbsp;&nbsp;&nbsp;&nbsp;avg&nbsp;=&nbsp;(red&nbsp;+&nbsp;green&nbsp;+&nbsp;blue)&nbsp;/&nbsp;3; &nbsp;&nbsp;&nbsp;&nbsp;cdata(y,&nbsp;x,&nbsp;1)&nbsp;=&nbsp;avg; &nbsp;&nbsp;&nbsp;&nbsp;cdata(y,&nbsp;x,&nbsp;2)&nbsp;=&nbsp;avg; &nbsp;&nbsp;&nbsp;&nbsp;cdata(y,&nbsp;x,&nbsp;3)&nbsp;=&nbsp;avg; }也许有更好的方法来检测红色和平均灰度,但这是一个开始;)
打开App,查看更多内容
随时随地看视频慕课网APP