将对象缩小到像素
我正在处理如图1所示的图像,该图像由点阵组成,并且需要转换为图2。
图1原始图像
图2想要的图像
为了完成转换,首先检测每个点的edge
,然后进行dilation
。 选择合适的参数后,结果令人满意,如图3所示。
图3扩张后的图像
我在MATLAB中处理过相同的图像。 当将物体(如图3)缩小到像素时,函数bwmorph(Img,'shrink',Inf)
起作用,其结果恰好来自图2所示的位置。 那么如何在opencv中获得相同的想要的图像? 似乎没有类似的shrink
功能。
这是我寻找边缘和扩张操作的代码:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
using namespace cv;
// Global variables
Mat src, dilation_dst;
int dilation_size = 2;
int main(int argc, char *argv[])
{
IplImage* img = cvLoadImage("c: 01a.bmp", 0); // 001a.bmp is Fig.1
// Perform canny edge detection
cvCanny(img, img, 33, 100, 3);
// IplImage to Mat
Mat imgMat(img);
src = img;
// Create windows
namedWindow("Dilation Demo", CV_WINDOW_AUTOSIZE);
Mat element = getStructuringElement(2, // dilation_type = MORPH_ELLIPSE
Size(2*dilation_size + 1, 2*dilation_size + 1),
Point(dilation_size, dilation_size));
// Apply the dilation operation
dilate(src, dilation_dst, element);
imwrite("c: 01a_dilate.bmp", dilation_dst);
imshow("Dilation Demo", dilation_dst);
waitKey(0);
return 0;
}
1-找到图像中的所有轮廓。
2-使用时刻找到他们的群众中心。 例:
/// Get moments
vector<Moments> mu(contours.size() );
for( int i = 0; i < contours.size(); i++ )
{ mu[i] = moments( contours[i], false ); }
/// Get the mass centers:
vector<Point2f> mc( contours.size() );
for( int i = 0; i < contours.size(); i++ )
{ mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); }
3-创建零(黑色)图像并写入所有中心点。
4-注意,你将有额外的一个或两个点来自边界轮廓。 也许你可以根据轮廓区域进行一些预过滤,因为边界是一个大面积连接的大轮廓。
虽然速度不是很快,但我使用了由William K. Pratt提供的第4版Digital Image Processing中的形态滤波算法。 这应该是你正在寻找的。
该代码是MIT许可的,可以通过cgmb / shrink在GitHub上获得。
具体来说,我已经定义了cv::Mat cgmb::shrink_max(cv::Mat in)
来缩小CV_8UC1
类型的给定cv::Mat
,直到不能进一步缩小。
所以,如果我们用你的程序编译Shrink.cxx并像这样改变你的代码:
#include "Shrink.h" // add this line
...
dilate(src, dilation_dst, element);
dilation_dst = cgmb::shrink_max(dilation_dst); // and this line
imwrite("c: 01a_dilate.bmp", dilation_dst);
我们得到这个:
顺便说一下,您的图像显示了Octave Image的bwmorph缩小实现中的一个错误。 图2不应该是图3中收缩操作的结果,因为环不应该被收缩操作破坏。 如果这个环在MATLAB中消失了,它也可能会遭受某种类似的错误。
目前,Octave和我的MATLAB结果略有不同,但它们非常接近。
链接地址: http://www.djcxy.com/p/89797.html