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

How to remove colour background of an image in MATLAB

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

image = imread('F:.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)

解决方案

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

  1. post-需要处理形态学操作,因为有些背景像素不是绿色的(有些是黑色的)。

  2. 在rgb上加上白色背景会更容易space。

代码

我建议以下解决方案:

%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)

结果

你好像不明白自己在做什么。有评论:

% 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 绿色,并降低特定绿色的亮度(或任何你想做的)。

为此,执行:

% 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 中的绿色检测范围。