3

嗨,我想知道是否有人可以就下图中的水面(而不是下面的)气泡大小的潜在方法提供任何指示。如果可能的话,我想使用开源软件(鉴于图像是矩阵,我的想法倾向于八度音阶)。我完全没有图像处理方面的背景,所以欢迎任何想法。显然,作为起点,我知道原始图像中每个像素的大小(该图像是压缩版本),因此以像素为单位计算半径将是完美的。

气泡图像

根据@mmgp 的想法进行编辑

因此,为了让问题更直接,我使用 Opencv 的开源库吸收了@mmgp 的想法。我以前从未使用过它(实际上也没有直接用 C 或 C++ 编程,但它看起来好像可以满足我的需求,虽然它看起来好像有一个陡峭的学习曲线,但我的经验告诉我那些经常提供最强大功能的解决方案需要花时间学习。所以这是我到目前为止所做的(没有图像处理背景我不确定我使用的功能是否理想,但我认为它可能会促进进一步的思考)。我已将图像转换为灰度,使用二进制阈值,然后对圆圈应用霍夫变换。我在每个阶段生成的图像以及我使用的代码如下。很明显,trackerbars 对于动态调整参数非常有用。然而,我还不够熟练地在我的代码中实现它们(任何指针都会很棒,特别是关于 Hough 变换,其中有一些参数需要调整)。

所以你怎么看?我还可以尝试哪些其他功能?显然,我的尝试远不及@mmgp,但这可能只是调整参数的问题。

这是照片:灰度(为了完整性): 灰度图像 二进制阈值: 灰度图像 圆形图像: 灰度图像

这是代码:

 #include "opencv2/highgui/highgui.hpp"
 #include "opencv2/imgproc/imgproc.hpp"
 #include <iostream>
 #include <stdio.h>

 using namespace cv;

 /** @function main */
 int main(int argc, char** argv)
 {
 Mat src, src_gray, src_bw;

 /// Read the image
 src = imread( argv[1], 1 );

 if( !src.data )
 { return -1; }

 /// Convert it to gray
 cvtColor( src, src_gray, CV_BGR2GRAY );
 imwrite( "Gray_Image.jpg", src_gray );

 /// Threshold the image to make binary
 threshold(src_gray, src_bw, 140, 255, CV_THRESH_BINARY);
 imwrite( "Binary_Image.jpg", src_bw );

 vector<Vec3f> circles;

 /// Apply the Hough Transform to find the circles
 HoughCircles( src_bw, circles, CV_HOUGH_GRADIENT, 5, src_bw.rows/2, 5, 10, 0, 0 );

 /// Draw the circles detected
 for( size_t i = 0; i < circles.size(); i++ )
 {
 Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
 int radius = cvRound(circles[i][2]);
 // circle center
 circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
 // circle outline
 circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );
 }

 /// Show your results
 namedWindow( "Hough Circle Transform Demo", 0 );
 namedWindow( "Gray", 0 );
 namedWindow( "Binary Threshold", 0 );
 imshow( "Hough Circle Transform Demo", src );
 imshow( "Gray", src_gray );
 imshow( "Binary Threshold", src_bw );
 imwrite( "Circles_Image.jpg", src );
 waitKey(0);
 return 0;
 }
4

1 回答 1

0

另一个可能考虑的路径是模板匹配

您只需要创建一个典型气泡的模板图像。

这对于识别由霍夫变换识别的误报可能很有用。

您将需要使用不同大小的模板图像来检测不同大小的气泡。

此外,如果您有气泡出现之前的水图片,您可以将其减去以找到图像中有气泡的区域。

于 2013-06-14T06:09:17.370 回答