2017-08-01 129 views
1

我在图像处理中遇到了这个问题,我找不到解决这个问题的算法。它很容易理解,但我不知道如何在OpenCV或在Matlab所以任何算法或函数其中之一(MATLAB或opencv)是有用的。在边缘图像中查找最大轮廓的像素

。假设我有一个image和背景的场景像下面

enter image description here

。我将边缘检测器应用到image,我的current image将如下图所示。

enter image description here

我Problm是,如何找到最大的轮廓或区域象下面这样edge形象?

enter image description here


如果你想原始图片的原始图片是 enter image description here

,并在Matlab你可以通过下面的代码获得边缘图像。

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) 

OpenCV中您可以使用下面的代码

#include <opencv2/opencv.hpp> 
using namespace cv; 
int main() 
{ 
    Mat img = imread("1.png"); 

    Mat gray; 
    cvtColor(img,   //BGR form image 
      gray,   //Mat for gray(destination) 
      CV_BGR2GRAY); //type of transform(in here BGR->GRay) 

    Mat edgeImage; 
    Canny(gray,  //Input Array 
     edgeImage, //Output Array 
     40,   // Lower threshold 
     120);  //Upper threshold 

    namedWindow("Edge-Image");  //create a window for display image 
    imshow("Edge-Image",edgeImage); //Display edgeImage in window that in before line create 
    waitKey(0);      //stick display window and wait for any key 

    return 0; 

} 
+0

你应该提供你的输入图像,以便其他人可以处理它们,如果他们愿意 – Piglet

+0

@Piglet感谢您的评论,但这幅图像从一篇文章中剪切出来,在那篇文章中,作者没有解释他们是如何识别这个区域的,所以很不幸我没有它,但是我认为如果你将边缘检测器应用于大多数图像,轮廓。但如果这可以帮助我裁剪文章中的图像 –

回答

1

下面是使用imdilate在Matlab解决关闭轮廓和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) 

的结果是:

The result: Mask

最佳,

1

首先关闭与形态闭轮廓,因为你现在不能找到它,因为它是不是一个真正的独特的轮廓,但其中的一部分较大的一个。

关闭后,只需使用findContours()函数并使用其输出来获取每个轮廓的面积,并最终使用contourArea()函数找到最大值。