您好,我想知道是否有人可以提供关于在下面的图像中确定水面上气泡(不是它下面的气泡)的可能方法的任何指示。我想尽可能使用开源软件(考虑到图像是矩阵,我的思维倾向于八度)。我绝对没有图像处理的背景,所以欢迎任何想法。显然,作为一个起点,我知道原始图像中每个像素的大小(此图像是压缩版本),因此以像素为单位计算半径将是完美的。
Bubble image http://i46.tinypic.com/volbhx.jpg
根据@mmgp
的想法进行编辑因此,为了更加直接地提出问题,我已经使用Opencv的开源库来了解@mmgp的想法。我之前从未使用过它(也没有直接用C或C ++编程,但它看起来好像可以满足我的需求,虽然它看起来好像有一个陡峭的学习曲线我的经验告诉我那些提供最强大功能的解决方案需要花时间学习。所以这就是我到目前为止所做的事情(没有图像处理的背景我不确定我使用的功能是否理想,但我认为它可能会促进进一步的思考)。我已将图像转换为灰度,使用二进制阈值,然后对圆圈应用Hough变换。我在每个阶段生成的图像以及我使用的代码。显而易见的是,跟踪条对于动态调整参数非常有用。但是我还不够熟练地在我的代码中实现它们(任何指针都会很棒,特别是关于Hough变换,其中有一些参数需要调整)。
那你觉得怎么样?我可以尝试哪些其他功能?很明显,我的尝试远没有@mmgp那么好,但这可能仅仅是调整参数的问题。
以下是照片: 灰度(完整性): Grayscale image http://i49.tinypic.com/avsj69.jpg 二进制阈值: Grayscale image http://i45.tinypic.com/16061e9.jpg 圆形图像: Grayscale image http://i47.tinypic.com/2dtrfpd.jpg
以下是代码:
#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;
}
答案 0 :(得分:0)
另一个可能的考虑因素是Template matching
您只需要创建典型气泡的模板图像。
这可能有助于识别由Hough变换识别的误报。
您需要使用不同大小的模板图像来检测不同大小的气泡。
另外,如果你有气泡出现之前的水的图片,你可以减去它以找到有气泡的图像区域。