如何在MATLAB中去除图像的彩色背景

如何在MATLAB中去除图像的彩色背景,matlab,image-processing,rgb,hsv,canny-operator,Matlab,Image Processing,Rgb,Hsv,Canny Operator,我想删除这张图片中的绿色像素,并将其替换为白色背景,作为对这张图片进行精明检测的初步步骤,以便仅检测扳手。我将其转换为hsv,并认为h没有绿色,如下所示,但不起作用。请帮忙 image = imread('F:\03.jpg'); hsv = rgb2hsv(image); hChannel = hsv(:, :, 1); sChannel = hsv(:, :, 2); vChannel = hsv(:, :, 3); newH = hsv(:,:,1) > 0.25 & hsv

我想删除这张图片中的绿色像素,并将其替换为白色背景,作为对这张图片进行精明检测的初步步骤,以便仅检测扳手。我将其转换为hsv,并认为h没有绿色,如下所示,但不起作用。请帮忙

image = imread('F:\03.jpg');
hsv = rgb2hsv(image);
hChannel = hsv(:, :, 1);
sChannel = hsv(:, :, 2);
vChannel = hsv(:, :, 3);
newH = hsv(:,:,1) > 0.25 & hsv(:,:,1) < 0.41;
newV = (0.1) * vChannel;    % I am trying to change brightness
newHSVImage = cat(3, newH, sChannel, newV);
newRGBImage = hsv2rgb(newHSVImage);
imshow(newRGBIMage)
image=imread('F:\03.jpg');
hsv=rgb2hsv(图像);
hChannel=hsv(:,:,1);
sChannel=hsv(:,:,2);
vChannel=hsv(:,:,3);
newH=hsv(:,:,1)>0.25&hsv(:,:,1)<0.41;
新值=(0.1)*V通道;%我试图改变亮度
newHSVImage=cat(3,newH,sChannel,newV);
newRGBImage=hsv2rgb(newHSVImage);
imshow(newRGBIMage)

解决方案

您的解决方案有两个主要问题:

%generates mask of forground
fgMask = ~(hsv(:,:,1) > 0.25 & hsv(:,:,1) < 0.41);
CC = bwconncomp(fgMask);
numOfPixels = cellfun(@numel,CC.PixelIdxList);
[~,indexOfMax] = max(numOfPixels);
fgMask = zeros(size(fgMask));
fgMask(CC.PixelIdxList{indexOfMax}) = 1;

%morphological operations
fgMask = imopen(fgMask,strel('disk',2));
fgMask = imclose(fgMask,strel('disk',5));

%updating image in RGB space
rChannel = image(:, :, 1); rChannel(~fgMask) = 255;
gChannel = image(:, :, 2); gChannel(~fgMask) = 255;
bChannel = image(:, :, 3); bChannel(~fgMask) = 255;
image = cat(3, rChannel, gChannel, bChannel);

%display image
imshow(image)
  • 由于一些背景像素不是绿色的(有些是黑色的),因此需要进行后处理形态学操作

  • 在rgb空间中添加白色背景会更容易

  • 代码

    我建议采取以下解决办法:

    %generates mask of forground
    fgMask = ~(hsv(:,:,1) > 0.25 & hsv(:,:,1) < 0.41);
    CC = bwconncomp(fgMask);
    numOfPixels = cellfun(@numel,CC.PixelIdxList);
    [~,indexOfMax] = max(numOfPixels);
    fgMask = zeros(size(fgMask));
    fgMask(CC.PixelIdxList{indexOfMax}) = 1;
    
    %morphological operations
    fgMask = imopen(fgMask,strel('disk',2));
    fgMask = imclose(fgMask,strel('disk',5));
    
    %updating image in RGB space
    rChannel = image(:, :, 1); rChannel(~fgMask) = 255;
    gChannel = image(:, :, 2); gChannel(~fgMask) = 255;
    bChannel = image(:, :, 3); bChannel(~fgMask) = 255;
    image = cat(3, rChannel, gChannel, bChannel);
    
    %display image
    imshow(image)
    
    %生成forgfround的掩码
    fgMask=~(hsv(:,:,1)>0.25和hsv(:,:,1)<0.41);
    CC=BWConComp(fgMask);
    numOfPixels=cellfun(@numel,CC.PixelIdxList);
    [~,indexOfMax]=最大值(numOfPixels);
    fgMask=零(大小(fgMask));
    fgMask(CC.PixelIdxList{indexOfMax})=1;
    %形态学运算
    fgMask=imopen(fgMask,strel('disk',2));
    fgMask=imclose(fgMask,strel('disk',5));
    %在RGB空间中更新图像
    rChannel=图像(:,:,1);rChannel(~fgMask)=255;
    gChannel=图像(:,:,2);gChannel(~fgMask)=255;
    b通道=图像(:,:,3);b通道(~fgMask)=255;
    图像=cat(3,R通道,G通道,B通道);
    %显示图像
    imshow(图片)
    
    结果


    你似乎不明白自己在做什么。谨此陈辞:

    % Select only green indexes
    newH = hsv(:,:,1) > 0.25 & hsv(:,:,1) < 0.41;
    
    % Change brigthness of the whole image
    newV = (0.1) * vChannel; 
    


    您可能需要调整H中绿色检测的范围。

    @SaurabhMistry不要在文本中添加多余的代码标记。你没有给帖子添加任何有用的内容。编辑问题时,请确保其值随编辑而增加。我希望这是偶然的,你不只是为了声誉而玩游戏,下次使用一个均匀饱和度的平滑背景。那块地毯不太好如果你能去掉背景,那么你已经检测到扳手了。在那之后使用Canny有什么意义?我不想检测扳手。我想知道如果背景不是白色的话,如何应用完美的边缘检测。谢谢@AnderBiguri,这是对的,我把绿色像素变成了红色。我现在明白了为什么会这样。我想做的是将绿色像素替换为白色,这样我就可以有一个清晰的背景来进行边缘检测。我只是改变图像的亮度值,看看边缘是如何受到影响的。我将对此进行更多的研究。谢谢。OP想对结果应用Canny。请注意,给定此处计算的
    fgMask
    imdeplate(fgMask,strel('diamond',1))-fgMask
    给出对象的边缘。使用Canny是多余的。