【发布时间】:2019-08-28 23:16:38
【问题描述】:
您好,我想知道是否有人可以就下图中的水面(而不是下方的)气泡大小的潜在方法提供任何指示。如果可能,我想使用开源软件(鉴于图像是矩阵,我的想法倾向于八度音阶)。我完全没有图像处理方面的背景,所以欢迎任何想法。显然,作为起点,我知道原始图像中每个像素的大小(此图像是压缩版本),因此以像素为单位计算半径将是完美的。
根据@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;
}
【问题讨论】:
-
我认为这不太适合 SO,我见过更糟糕的问题。事实上,随着问题的提出(并举例说明),它可以期待具有良好结果的方法。它不是太宽泛,它与许多其他图像处理问题一样适合堆栈溢出。
-
这里:i.imgur.com/Wi24f.png 是我认为作为起点的结果,因为它主要只给出气泡所在的位置。它是灰度形态学、二值形态学和基本圆检测的结合。其他人可能有时间提出更详细(可能更好)的方法。
-
感谢@mmgp 的提示,您呈现的结果无疑是一个很好的开始。我特意选择了一张我更复杂的图像(许多小气泡和半个较大的气泡)来看看有什么可能。我想知道是否有可能检测到更大的气泡,即使它只显示了 ~ 一半?出于兴趣,您在什么软件中进行了处理?八度还是别的什么?
-
您可能还想考虑 ImageJ。至少在生命科学领域,它是图像处理的标准工具。这一切都在公共领域。
标签: image-processing opencv octave