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