如何在MATLAB中去除图像的彩色背景
我想删除这张图片中的绿色像素,并将其替换为白色背景,作为对这张图片进行精明检测的初步步骤,以便仅检测扳手。我将其转换为hsv,并认为h没有绿色,如下所示,但不起作用。请帮忙如何在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
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)
%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是多余的。