我想删除此图像中的绿色像素,并将其替换为白色背景作为初步步骤,对此图片进行精确检测以仅检测扳手。我把它转换成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)
答案 0 :(得分:7)
<强>解决方案强>
您的解决方案有两个主要问题:
需要进行后处理形态操作,因为一些背景像素不是绿色(其中一些是黑色)。
在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)
<强>结果强>
答案 1 :(得分:3)
你似乎不明白你在做什么。评论:
% Select only green indexes
newH = hsv(:,:,1) > 0.25 & hsv(:,:,1) < 0.41;
% Change brigthness of the whole image
newV = (0.1) * vChannel;
您的代码所做的是,获取所有绿色像素的逻辑索引,并降低整个图像的亮度。然后,使用逻辑索引作为颜色值,因此,如果执行newV = (1) * vChannel;
并绘图,您将意识到所有绿色现在都是红色(红色:HSV = 1)。
你想要的是选择绿色,并降低绿色的亮度(或任何你想做的事情)。
为此,请执行:
% Select only green indexes
green_index = hsv(:,:,1) > 0.25 & hsv(:,:,1) < 0.41;
% change the brigtness of those specific pixels
newV=vChannel;
newV(green_index)=0.1*newV(green_index);
newHSVImage = cat(3, hChannel, sChannel, newV);
您可能需要调整H中的绿色检测范围。