image-processing - 以 Octave 为单位调整气泡大小的图像处理

标签 image-processing opencv octave

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

Bubble image

根据@mmgp的想法编辑

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

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

照片如下: 灰度(为了完整性): Grayscale image 二进制阈值: Grayscale image 圆形图像: Grayscale image

代码如下:

 #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;
 }

最佳答案

另一种可能的考虑路径是 Template matching

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

这可能有助于识别霍夫变换识别的误报。

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

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

关于image-processing - 以 Octave 为单位调整气泡大小的图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14007913/

相关文章:

performance - 以更干净/更有效的方式过滤数据

c++ - 几个直方图的平均直方图

python - 如何将分割的图像与重叠合并

image - 检测图像中小细节的存在

c++ - 堆损坏错误;无法发布 cv::Mat opencv

python - 从文本图像中删除分界 - 图像处理

matlab - 特征提取步骤花费的时间太长

matlab - OpenCV:SIFT检测与匹配方法

c++ - 将 GpuMat 行复制到 std::vector

matlab - 使用 Octave 估算数据周期的最快方法是什么?