1

matlabで画像を処理したい

ここに画像の説明を入力してください

画像は、しっかりとした背景と2つの標本(上面と下面)で構成されています。上部と下部を分離して2つの画像にするコードがすでにあります。しかし、私がうまくいかない部分は、接着された領域にのみ画像をトリミングすることです(画像の赤いボックス、私は一番上のものだけをマークしました)。ただし、トリミングされた画像は、赤いボックスと同じように長方形である必要があります(黄色の背景は後で破棄できます)。

これはで実行できることは知っていますがimcrop、これにはユーザーからの手動入力が必要です。ユーザー入力なしでより多くの画像を処理できるように、コードを自動化する必要があります。すべての画像は同じ色になります(接着剤の場合は赤、素材の場合は黒)。

誰かがこれを手伝ってくれますか?

編集:助けてくれてありがとう。次のコードを使用して問題を解決しました。しかし、赤いボックスの右側の黒い部分を取り除くことができませんでした。これは、写真を作成する前にその部分をテープで留めることで修正できます。私が使用したコードは少し奇妙に見えますが、画像の黒い領域をカウントしてパーセンテージを取得することに成功しています。

a=imread('testim0.png');
level = graythresh(a);
bw2=im2bw(a, level);
rgb2=bw2rgb(bw2);
IM2 = imclearborder(rgb2,4);
pic_negative = ait_imgneg(IM2);

%% figures
% figure()
% image(rgb2)
% 
% figure()
% imshow(pic_negative)
%% Counting percentage
g=0;
for j=1:size(rgb2,2)
    for i=1:size(rgb2,1)
        if  rgb2(i,j,1) <= 0 ...
          & rgb2(i,j,2) <= 0 ...
          & rgb2(i,j,3) <= 0
        g=g+1;
        end
    end
end

h=0;
for j=1:size(pic_negative,2)
    for i=1:size(pic_negative,1)
        if  pic_negative(i,j)== 0
        h=h+1;
        end
    end
end

per=g/(g+h)

誰かがコードを改善するためのいくつかの提案を持っているなら、私はそれを聞いてうれしいです。

4

4 に答える 4

2

色(この場合は黄色、黒が目立つ)に基づいて2つの領域(背景、前景)に単純に画像をセグメンテーションする場合、オプションとして、kmeansアルゴリズムを使用して画像の色の値をクラスタリングできます。さらに堅牢にするために、画像をRGBからL ab*色空間変換できます。

あなたのケースの例は、ここのMATLABImape処理の例に従います。

% read and transform to L*a*b space
im_rgb = double(imread('testim0.png'))./256;
im_lab = applycform(im_rgb, makecform('srgb2lab')); 

ここに画像の説明を入力してください

ここに画像の説明を入力してください

% keep only a,b-channels and form feature vector
ab = double(lab_I(:,:,2:3));
[nRows, nCols, ~] = size(ab);
ab = reshape(ab,nRows * nCols,2);

% apply k-means for 2 regions, repeat c times, e.g. c = 5  
nRegions = 2;
[cluster_idx cluster_center] = kmeans(ab,nRegions, 'Replicates', 5); 

% get foreground-background mask
im_regions = reshape(cluster_idx, nRows, nCols);

ここに画像の説明を入力してください

結果のバイナリ画像を使用して、元の参照画像の関心領域にインデックスを付ける(または境界を見つける)ことができます。

于 2012-09-19T22:18:07.167 に答える
0

画像はマトリックスとして保存されます。切り抜きボックスのピクセル単位の境界が切り抜きたいことがわかっている場合は、インデックスを使用して切り抜きを実行できます。

M = rand(100); % create a 100x100 matrix or load it from an image
left = 50;
right = 75;
top = 80;
bottom = 10;

croppedM = M(bottom:top, left:right);
%save croppedm
于 2012-09-19T20:38:19.673 に答える
0

あなたは簡単に未知の境界作物を得ることができます

1)画像をプロットする等高線、

2)find()最大/最小X / ysの結果について、

3)@slaytonのメソッドを使用して、実際のトリミングを実行します。

編集:あなたの実際の画像を見ただけです-それはそれほど簡単ではありません。ただし、最初に画像の色を強調/しきい値設定すると、輪郭が適切な精度で機能するはずです。言うまでもなく、これには特定の状況に合わせて調整する必要があります。

于 2012-09-19T20:52:53.687 に答える
0

すでに上部と下部を分離することができ、必要な領域(不要な右側の小さな部分を含む)をセグメント化することもできるので、最後に修正を追加することをお勧めします以下を介してコードの。

セグメンテーション後、各列の青の強度値を合計して、画像を2Dから1Dに圧縮します。したがって、元の領域がwidth = 683 height = 59の場合、新しいマトリックス/画像は単純にwidth = 683 height=1になります。これで、小さなしきい値を適用してエッジを配置する場所を決定し、その場所の画像に切り抜きを適用できます。今、あなたはあなたの統計を取得します。

于 2012-09-21T04:31:55.013 に答える