Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何将rgb转换为灰色,但保持一种颜色不变_Matlab_Image Processing - Fatal编程技术网

Matlab 如何将rgb转换为灰色,但保持一种颜色不变

Matlab 如何将rgb转换为灰色,但保持一种颜色不变,matlab,image-processing,Matlab,Image Processing,我有一个我只想保留绿色部分,并将其他部分转换为灰度 从图像中的颜色来看,绿色实际上非常接近灰度,以至于你看不到任何东西。无论哪种方式,您都可以这样做: 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 =

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


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

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=双(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=零(大小(im));
对于i=1:尺寸(im,1),
对于j=1:尺寸(im,2),
如果q(i,j)=0,
imout(i,j,:)=imgs3(i,j,:);
其他的
imout(i,j,:)=im(i,j,:);
终止
终止
终止
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');
im=imread('houses.jpg');
s=(im(:,:,2)>im(:,:,1))和(im(:,:,2)>im(:,:,3));
dim=双(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=零(大小(im));
对于i=1:尺寸(im,1),
对于j=1:尺寸(im,2),
如果q(i,j)=0,
imout(i,j,:)=imgs3(i,j,:);
其他的
imout(i,j,1)=im(i,j,1);
i输出(i,j,2)=255;
imout(i,j,3)=im(i,j,3);
终止
终止
终止
imshow(uint8(imout))
imwrite(uint8(imout),'output.jpg');
结果是:


应该是这样的:

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);
我没有检查它,但我很确定它应该可以工作。
您可能只想修改遮罩的计算,目前它将包括比红色或蓝色更绿的所有像素,但您可能希望在选择哪些像素保持不变时更加(或更少)具体。

我建议使用纯粹基于色调的方法,因为您对特定颜色感兴趣。 我的方法是将图像转换为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);