【问题标题】:How to remove colour background of an image in MATLAB如何在MATLAB中去除图像的颜色背景
【发布时间】:2018-06-24 01:16:09
【问题描述】:

我想删除此图像中的绿色像素并将其替换为白色背景作为初步步骤,对这张图片进行精确检测以仅检测扳手。我将其转换为 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)

【问题讨论】:

  • @SaurabhMistry 不要在文本中添加多余的代码标记。您在帖子中没有添加任何有用的内容。当您编辑一个问题时,请确保它的价值随着您的编辑而增加。我希望这是偶然的,你不只是为了声誉而玩弄系统
  • 下次使用具有均匀饱和度的平滑背景。地毯不是很好
  • 如果您能够移除背景,那么您已经检测到了扳手。之后申请 Canny 有什么意义?
  • 我不想检测扳手。我想知道如果背景不是白色的,如何应用完美的边缘检测。

标签: matlab image-processing rgb hsv canny-operator


【解决方案1】:

解决方案

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

  1. 需要进行后处理形态学操作,因为一些背景像素不是绿色(其中一些是黑色)。

  2. 在 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)

结果

【讨论】:

  • OP 希望将 Canny 应用于结果。请注意,给定fgMask 在这里计算,imdilate(fgMask,strel('diamond',1))-fgMask 给出了对象的边缘。应用 Canny 是多余的。
【解决方案2】:

你似乎不明白你在做什么。使用 cmets:

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

【讨论】:

  • 谢谢@AnderBiguri 没错,我的绿色像素变成了红色。我现在明白为什么会这样了。我试图做的是将绿色像素替换为白色,这样我就可以有一个清晰的背景来进行边缘检测。我只是改变图像的亮度值,看看边缘是如何受到影响的。我将对此进行更多研究。谢谢。
猜你喜欢
  • 2020-02-15
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多