こんにちは、次の画像の水面 (その下ではなく) の泡のサイズを変更するための潜在的なアプローチについて、誰かが何か指針を提供できるかどうか疑問に思っています。可能であれば、オープン ソース ソフトウェアを使用したいと考えています (画像がマトリックスであることを考えると、私の心はオクターブに傾いています)。私は画像処理のバックグラウンドがまったくないので、どんなアイデアでも大歓迎です。明らかに出発点として、生の画像 (この画像は圧縮されたバージョン) の各ピクセルのサイズを知っているので、半径をピクセル単位で計算することは完璧です。
@mmgpの考えに基づいて編集
そのため、質問をより直接的にするために、Opencv のオープン ソース ライブラリを使用して @mmgp の考えを取り入れました。私はこれを以前に使用したことはありません (C または C++ で直接プログラムしたこともありませんが、私のニーズを満たすことができるように見えます。学習に時間を費やす必要があります. だからここに私がこれまでに行ったことがあります (画像処理のバックグラウンドがないため、使用した関数が理想的かどうかはわかりませんが、さらに考えることを促進する可能性があると思いました). 画像をグレースケールに変換しました, used a binary threshold and then applied a Hough Transform for circles. 各段階で生成する画像と、使用したコードを以下に示します。明らかなことは、トラッカーバーがその場でパラメーターを微調整するのに非常に役立つということです。ただし、コードにそれらを実装するのに十分なほど熟達していません(特に、微調整するパラメーターがいくつかあるハフ変換に関しては、ポインターは素晴らしいでしょう)。
それで、あなたはどう思いますか?他にどのような機能を試すことができますか? 明らかに、私の試みは@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;
}