1

RGB画像があります。画像をスキャンしました。そのため、画像は A4 サイズ シートの小さな部分を占めます。

画像の境界を見つけてトリミングしたい。「Sobel」などのエッジ検出演算子を使用できますが、画像に存在するすべてのエッジを検出します。私が欲しいのは、画像の境界線だけです。また、「bwboundaries」を含むエッジ検出関数の多くは、バイナリ イメージまたはグレースケール イメージでのみ機能します。私の画像はRGBです。

「imcrop」を使用してみましたが、これはよりインタラクティブなクロッピングです。私はこれを自動的に行うことに熱心です。

テスト画像のアップロード:

4

3 に答える 3

5

これは RGB 画像であるため、灰色の領域には明らかな色がありますが、白い領域には色がありません。これを利用して画像を見つけると、境界ボックスを取得できます。

img = imread('http://i.stack.imgur.com/dEawA.jpg');
%# instead of "==" you can check for similarity within a tolerance
tt=img(:,:,1)==img(:,:,2) & img(:,:,2) == img(:,:,3);

ここに画像の説明を入力

%# invert tt so that it's 1 where there is signal
tt = ~tt;

%# clean up some of the smaller artifacts
tto = imopen(~tt,strel('square',100));

ここに画像の説明を入力

%# get the areas and bounding box of the areas above threshold
%# as an additional criterion, you could also use excentricity
%# or you could simply remove the bottom 100 rows of the scan
stats = regionprops(tto,'BoundingBox','Area');
area = cat(1,stats.Area);
[~,maxAreaIdx] = max(Area);
bb = round(stats(maxAreaIdx).BoundingBox);

%# note that regionprops switches x and y (it's a long story)
croppedImage = img(bb(2):bb(2)+bb(4),bb(1):bb(1)+bb(3),:);

ここに画像の説明を入力

回転により縁が少し残っています。上記のマスクを使用して、ttoトリミングする前に画像以外のすべてのピクセルを NaN に設定するかimrotate、画像を修正するために使用できます。

于 2012-06-20T16:23:36.973 に答える
0

bwlabel http://www.mathworks.com/help/toolbox/images/ref/bwlabel.html (ヘルプ ページに記載されているように、find と共に) を使用して画像のインデックスを取得し、それらを使用して画像を切り抜くことができます。オリジナル。

im2bw 最初にhttp://www.mathworks.com/help/toolbox/images/ref/im2bw.htmlを使用して元の画像をバイナリに変換する必要があります。

于 2012-06-20T15:59:32.450 に答える
0

Harris-Detector ( cornerMatlab) などを使用して、画像の角を検出することができます。検出するコーナーの最大数を 4 に設定します。次に、 のコーナーの位置を使用しimcropます。画像を投稿していただければ、より具体的なヒントを提供できます。画像が RGB であることは問題ではありません。グレースケールに変換するだけです。

于 2012-06-20T14:38:15.770 に答える