【问题标题】:How to convert rgb to gray but keep one colour unchanged如何将 rgb 转换为灰色但保持一种颜色不变
【发布时间】:2014-01-08 05:26:14
【问题描述】:

我有一个image,我只想保留绿色部分并将其他部分转换为灰度。

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    从您图像中的颜色看来,绿色实际上非常接近灰度,您将看不到任何东西。无论哪种方式,您都是这样做的:

    im = imread('houses.jpg');
    s= (im(:,:,2)>im(:,:,1))&(im(:,:,2)>im(:,:,3));
    dim = double(im);
    r = abs(dim(:,:,2)-((dim(:,:,1))+dim(:,:,2)+dim(:,:,3))/3) < 3;
    q = s|r;
    imgs = rgb2gray(im);
    imgs3(:,:,1) = imgs;
    imgs3(:,:,2) = imgs;
    imgs3(:,:,3) = imgs;
    imout = zeros(size(im));
    for i=1:size(im,1),
        for j=1:size(im,2),
            if q(i,j) == 0,
                imout(i,j,:) = imgs3(i,j,:);
            else,
                imout(i,j,:) = im(i,j,:);
            end
        end
    end
    imshow(uint8(imout))
    imwrite(uint8(imout),'output.jpg');
    

    如果您想看到一些有用的东西,您可能需要执行以下操作

    im = imread('houses.jpg');
    s= (im(:,:,2)>im(:,:,1))&(im(:,:,2)>im(:,:,3));
    
    dim = double(im);
    r = abs(dim(:,:,2)-((dim(:,:,1))+dim(:,:,2)+dim(:,:,3))/3) < 3;
    q = s|r;
    imgs = rgb2gray(im);
    imgs3(:,:,1) = imgs;
    imgs3(:,:,2) = imgs;
    imgs3(:,:,3) = imgs;
    imout = zeros(size(im));
    for i=1:size(im,1),
        for j=1:size(im,2),
            if q(i,j) == 0,
                imout(i,j,:) = imgs3(i,j,:);
            else,
                imout(i,j,1) = im(i,j,1);
                imout(i,j,2) = 255;
                imout(i,j,3) = im(i,j,3);
            end
        end
    end
    imshow(uint8(imout))
    imwrite(uint8(imout),'output.jpg');
    

    结果如下:

    【讨论】:

      【解决方案2】:

      应该是这样的:

      gray_img = rgb2gray(img);
      green_mask = img(:,:,2) > img(:,:,1) & img(:,:,2) > img(:,:,3);
      gray_img3 = cat(3, gray_img, gray_img, gray_img);
      green_mask3 = cat(3, green_mask, green_mask, green_mask);
      output_img = gray_img3;
      output_img(green_mask3) = img(green_mask3);
      

      我没有检查它,但我很确定它应该可以工作。 您可能要修改的唯一内容是遮罩的计算,目前它将包括所有比红色或蓝色更绿色的像素,但您可能希望更具体(或更少)选择哪些像素保持不变。

      【讨论】:

        【解决方案3】:

        我建议使用纯粹基于 hue=based 的方法,因为您对特定颜色感兴趣。 我的方法是将您的图像转换为 HSV 颜色空间并检查色调通道。

        img=imread('houses.jpg');
        hsv=rgb2hsv(img);
        % find the white areas of the image
        gray_part=hsv(:,:,3)>0.7;
        % find the green areas of the image that are not white
        green_part=hsv(:,:,1)>(30/360) & hsv(:,:,1)<(210/360) & ~gray_part;
        % create the output image
        outimg=(uint8(double(img).*repmat(green_part,[1 1 3])));
        figure;
        subplot(121); imshow(img); 
        subplot(122); imshow(outimg);
        

        这将为您提供以下图像(左:原始图像,右:生成的蒙版图像):

        当然,如果你需要得到灰度图像的其余部分,你可以使用前面的结果如下:

        pixel(1,1,1)=0;pixel(1,1,2)=255;pixel(1,1,3)=0;
        green_img=repmat(pixel,[size(img,1) size(img,2), 1]);
        green_part=repmat(green_part,[1 1 3]);
        gray_img=rgb2gray(uint8(double(img).*~green_part));
        gray_img=double(repmat(gray_img,[1 1 3]));
        outimg=uint8(green_part.*green_img + gray_img);
        figure; imshow(outimg);
        

        这将显示如下所示的图像:

        【讨论】:

          猜你喜欢
          • 2021-12-12
          • 2016-04-26
          • 2014-10-31
          • 1970-01-01
          • 2021-11-27
          • 2020-12-09
          • 1970-01-01
          • 1970-01-01
          • 2019-02-08
          相关资源
          最近更新 更多