2016-05-23 11 views
6

サークルのイメージがありますが、サークルは見つけたいがハフリングサークルは使用しません。ハーフサークルを使用しないサークルの検出

私は道を見つけた、リンクhere

しかし、円のx座標とy座標がわからないので、白から黒への遷移座標は見つかりません。他にどんな方法がありますか、あるいは私はそのアプローチをどのように働かせることができますか?

これは私のテスト画像です:

enter image description here

答えて

3

1つの可能なアプローチは、最初のthresholdに円の周りのノイズの一部を取り除くための画像です。次に、Cannyエッジ検出を使用して円のエッジを抽出することができます。最後に、findNonZeroピクセル座標のリストを取得します。

import cv2 
import numpy as np 

img = cv2.imread('circle.png', 0) 
mask = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1] 
edges = cv2.Canny(mask, 20, 100) 
points = np.array([p[0] for p in cv2.findNonZero(edges)]) 

をそしてすべての中間画像を保存したピクセルをプロットするためにいくつかの余分なコードを追加し、C++に移植:


は、私が最初のPythonで迅速なプロトタイプをしました。

#include <opencv2/opencv.hpp> 

int main() 
{ 
    cv::Mat img(cv::imread("circle.png", 0)); 

    cv::Mat mask; 
    cv::threshold(img, mask, 127, 255, cv::THRESH_BINARY); 

    cv::imwrite("circle_1.png", mask); 

    cv::Mat edges; 
    cv::Canny(mask, edges, 20, 100); 

    cv::imwrite("circle_2.png", edges); 

    std::vector<cv::Point2i> points; 
    cv::findNonZero(edges, points); 

    cv::Mat output(cv::Mat::zeros(edges.size(), CV_8UC3)); 
    for (auto const& p : points) { 
     output.at<cv::Vec3b>(p) = cv::Vec3b(127, 255, 127); 
    } 
    cv::imwrite("circle_3.png", output); 
} 

thresholdの出力:Canny

出力:

再プロットピクセル:

+3

サークルパラメータが必要な場合は、「minEnclosingCircle」を使用してください – Miki

+0

ありがとうございます:) –

4

別のアプローチ(それはちょうど円以上するのに便利です)image contoursを見つけて、それは質量の中心だ見つけるために、円周上にimage moment analysisを行うには、次のようになります。

enter image description here

enter image description here

画像処理を進める場合は、そのことを学ぶことをおすすめします。それらは、画像をより有用な構造に変換する非常に有用なアプローチです。

+0

ありがとうございます@Lamar Latrell –

+0

ラマー!あなたの知識は抜群です!私にメッセージをお願いしますか:[email protected]ですか?私はコンピュータサイエンスの学生で、私は本当に素早い助けを使うことができました!どうもありがとうございます! –

+0

@RoiMulia、私はあなたがより高速な応答のためにStackOverflowを使用することをお勧めします:) –

関連する問題