4

私はこのイメージを持っています:

矩形

これは長方形のようですが、正確ではありません。長方形の輪郭を見つけたいのですが、エッジハフを使用しようとしましたが、連続した線が見つかりません。私も侵食膨張を試みましたが、たとえば、一番上の水平線の1ピクセルの違いを消去できないため、連続線はまだ見つかりません。

問題の 2 番目の部分は、それをまっすぐにすることです。

私が得た別のアイデアは、それらを直線で結ぶコーナーを見つけることでしたが、それもうまくいきません.

複雑であってはならないと確信していますが、私にはできません。

どんなアイデアでも大歓迎です!乾杯

4

3 に答える 3

2

を使用regionprops()して、バイナリ イメージ内の連続領域の境界ボックスを見つけることができます。

img = imread('rect.jpg');
bw = im2bw(img);

% find both black and white regions
stats = [regionprops(bw); regionprops(not(bw))]

% show the image and draw the detected rectangles on it
imshow(bw); 
hold on;

for i = 1:numel(stats)
    rectangle('Position', stats(i).BoundingBox, ...
    'Linewidth', 3, 'EdgeColor', 'r', 'LineStyle', '--');
end

結果:

長方形が描かれた画像

于 2013-03-06T19:29:05.527 に答える
1

輪郭を見つけるには、エッジ検出を行ってから線を太くします。あなたの図はそのようなものなので、モルフォロジー演算だけでは直線が得られない場合があります。形態学的操作は、画像全体に同じ効果を適用します。また、エッジ検出では直線が得られません。

直線を見つける限り、問題は最小外接長方形を見つけるカテゴリに分類されると思います。しかし、用語がstraight意味する場合はparallel to X-Y axis、答えによって機能するJunuxxはずです。最小境界四角形は画像にしっかりと付着しますが、必ずしも XY 軸に平行ではありません。そのアルゴリズムの実装については、こちらを参照してください。上の画像の最小境界四角形を見つけるには、最初に from を使用removebwmorph、次にその点セットを最小境界四角形アルゴリズムへの入力として指定します。

于 2013-03-06T20:38:28.570 に答える
0

「黒」と「白」の値がわかっていると仮定すると、中間点で輪郭を描くことでエッジを見つけることができます。したがって、黒 = 0 で白 = 1 の場合は、0.5 で輪郭を描きます。たとえば、次のようにしてこれを行うことができます。

img = zeros(500, 500);
img(200:300, 200:300) = 1;
img(210:290, 210:290) = 0;
img = imrotate(img, 3);
c = contourc(img, 0.5*[1 1]); % repeat 0.5 to be interpreted as value of contour

輪郭の座標は c になりました。等高線をプロットすることもできます

contour(img, 0.5*[1 1]);

を見るとc、角がどこにあるかがわかります。それがわかればimtransform、画像処理ツールボックスにあるを使用して射影変換を行うことができます。

この2つがうまくいくことを願っています...

于 2013-03-06T17:03:37.533 に答える