我在图像处理中遇到这个问题,我找不到一个算法来解决这个问题。理解起来很简单,但我不知道如何在OpenCV
或{{1}中实现它所以其中一个(MATLAB或opencv)中的任何算法或函数都是有用的。
1 。假设我有一个Matlab
和场景背景,如下所示
2 。我将边缘检测器应用于image
,而我的image
将如下图所示。
我的问题是如何在current image
图片中找到如下所示的最大轮廓或区域?
在matlab中,您可以通过以下代码获得边缘图像。
edge
在OpenCV中,您可以使用以下代码
clc
clear
img = imread('1.png'); % read Image
gray = rgb2gray(img); % Convert RGB to gray-scale
edgeImage = edge(gray,'canny',0.09); % apply canny to gray-scale image
imshow(edgeImage) % Display result in figure(MATLAB)
答案 0 :(得分:1)
首先用形态学闭合来关闭轮廓,因为你现在无法找到它,因为它不是一个真正独特的轮廓,而是较大轮廓的一部分。
关闭后,只需使用findContours()函数并使用其输出来获取每个轮廓的区域,并最终使用contourArea()函数找到最大值。
答案 1 :(得分:1)
以下是Matlab中使用imdilate
关闭轮廓和regionprops
来获取闭合对象区域的解决方案:
% Your code to start
img = imread('Image.png'); % read Image
gray = rgb2gray(img); % Convert RGB to gray-scale
edgeImage = edge(gray,'canny',0.09); % apply canny to gray-scale image
% First dilate to close contours
BW = imdilate(edgeImage, strel('disk',4,8));
% Then find the regions
R = regionprops(~BW, {'Area', 'PixelIdxList'});
% Find the second biggest region (the biggest is the background)
[~, I] = sort([R(:).Area], 'descend');
Mask = zeros(size(img));
Mask(R(I(2)).PixelIdxList) = 1;
% Display
clf
imshow(Mask)
结果是:
最佳,