【デジタル画像処理】実験3 画像分割(MATLAB実現)

1. 実験の意義と目的

( 1 ) 画像処理ツール Matlab をさらに使いこなし Matlab ベースの画像処理関数に精通します。
(2) 画像セグメンテーション方法をマスターし、一般的に使用される画像記述方法に精通します。

2. 実験内容

画像 Imageを開き、 Matlab画像処理関数 を使用してその画像に対して次の変換を実行します。
( 1 ) 画像を グレーに グレースケールし、 しきい値処理によってBWに変換します
(2) BWに対して 数学的形態フィルタリングを実行します。
(3) 図で赤い線でマークされた BWで​​エッジ トラッキングを実行します。
(4)各領域の境界点のフーリエ記述子を計算し、4分の1点で境界を再構成する。
(5) 実験要件の内容を拡充しました。

3. Matlab関連機能の紹介

( 1 ) im2bw関数
BW = im2bw(I, level) :グレースケール イメージ Iを、 level を しきい値として バイナリ イメージに変換します。
(2) greythresh関数
level = greythresh(I) 。Otsuメソッド を使用して しきい値を取得し、レベルは[0,1]区間に正規化されます
(3)二値化関数
BW = imbinarize(I) : OTSU法に基づく グローバルしきい値を使用して、グレースケール イメージ I の 2 値化を実現します。
BW = imbinarize(I, METHOD) : METHOD で指定されたメソッドを使用して、グレースケール イメージ I を実現するためのしきい値を取得します。
二値化。 METHOD オプションの 'global' および 'adaptive' 、前者は OTSU メソッドを指定し、後者はローカル適応しきい値を使用します
方法。
(4) bwboundaries関数
バイナリ イメージ BW の外側と内側の境界を検索します。
[B,L,N,A] = bwboundaries(BW,CONN,OPTIONS) : この関数は、 BW 0を持つ 要素を背景ピクセルとみなします。
ポイント、 1 の付いた要素が 抽出対象の境界になります。 B の各要素は Q×2 行列であり、行列の各行には境界が含まれます。
ピクセルの行座標と列座標、 Q は境界に含まれるピクセルの数です。 L (識別行列) は、バイナリ イメージ内のエッジを識別します。
境界によって分割された領域、 N は領域の数 N A は分割された領域の隣接関係。 CONNには 4 が かかり 、検索には時間がかかります
4接続方式 を使用します 。デフォルトは 8 、つまり 8 接続方式です。 OPTIONS は アルゴリズムの検索方法を指定します。デフォルトは 'holes'です
オブジェクトの内側と外側の境界を検索します。 「noholes」は オブジェクトの外側の境界のみを検索します。
(5) bwtraceboundary関数は、バイナリ イメージBW内のターゲット輪郭をトレースします
B = bwtraceboundary(BW,P,FSTEP) : ターゲット領域の値は 0ではありません ; パラメータ P は、最初の追跡ポイントの行および列の座標です
バイナリ ベクトル。FSTEP は、 オブジェクト内の Pに 接続されている次のピクセルを見つけるために使用される初期検索方向を表します。これは、 'N' 'NE'
'E' 'SE' 'S' 'SW' 'W' 'NW' ; 戻り値 Bは、 Q×2行列 である境界座標値です
(6)ストレル関数
  形態学的構造要素を作成します。
  SE = strel(shape,parameters) shapeで 指定された構造要素を作成します。ここで、 shapeのタイプは次 のとおりです。
  任意 ペア ダイヤモンド 周期線 ディスク 長方形 ライン 正方形 、八角形 、     パラメータ パラメータ
  一般に SEのサイズを制御します
(7) imdilate関数
  IM2 = imdilate(IM, SE) : イメージ IM を拡張し 、拡張されたイメージ IM2を返します 。SE 構造要素です。
(8) imerode関数
  IM2 = imerode(IM,SE) : イメージ IM を腐食し 、エッチングされたイメージ IM2を返します 。SE 構造要素です。
(9) imopen関数
  IM2 = imopen(IM,SE) :イメージ IM を開き、イメージを IM2として返します 。SE 構造要素です。
( 10 ) imclose関数
  IM2 = imclose(IM,SE) : イメージ IMに対して 終了操作を実行し、イメージを IM2として返します 。SE 構造要素です。
( 11 ) fftおよびfft2関数
  fft(X) :シーケンス Xに対して DFT演算 を実行します。
  fft2(X) :行列 Xに対して 2 次元 DFT 演算を実行します。
( 12 ) ifft関数ifft2関数
  ifft(X) : Xに対して IDFT演算 を実行します。

  ifft2(F) : Fに対して2 次元IDFT演算を実行します。

4. アルゴリズム原理

  画像セグメンテーションとは、画像を特定の特性を持つさまざまな領域に分割する画像処理技術を指します。これらの領域を抽出してさらに特徴を抽出することは、画像処理から画像分析までの重要なステップです。画像セグメンテーションはその重要性から、画像処理分野において常に研究の焦点となってきました。閾値分割法は、画像の濃淡値の分布特性に応じて一定の閾値を決定して画像を分割する方法である。元のグレースケール画像をf ( x , y ) とし、ある基準によってしきい値としてグレースケール値Tを選択し、各ピクセル値とTの関係を比較します。ピクセル値がT以上のピクセルは1つのクラスに分類され、変更される画素値は1であり、画素値が未満の画素は別の種類であり、その画素値は0に変更される式は次のとおりです。

    

 

境界追跡とは、厳密な「検出基準」に従ってターゲット オブジェクトの輪郭上のピクセルを見つけること、つまり、境界の探索開始点を決定することを指します。追跡終了条件が満たされるまで、特定の「追跡基準」に従って対象オブジェクト上の他のピクセルを検索します。

  境界の記述とは、関連する方法とデータを使用して領域の境界を表現することを指します。境界の記述には、幾何学的な情報と豊富な形状情報の両方が含まれており、非常に一般的な画像オブジェクトの記述方法です。フーリエ描写の方法は、主に DFT を使用してサブ再構成領域の境界曲線を描写します。フーリエの高周波成分は一部の詳細に対応し、低周波成分は基本形状に対応するため、複素数列の最初の M 個の係数のみが再構成に使用でき、残りは 0 に設定されます

   画像のセグメンテーションに関しては、古典的かつ伝統的な分水界アルゴリズムについて言及する必要があります。従来の分水界セグメンテーション アルゴリズムは、トポロジー理論に基づいた数理形態学のセグメンテーション方法であり、伝統的な分水界セグメンテーション方法は、トポロジー理論に基づいた数理形態学のセグメンテーション方法です。従来の分水界分割法は、トポロジー理論に基づいた数学的形態分割法であり、その基本的な考え方は、画像を測地学における位相地形とみなすことであり、画像内の各ピクセルのグレー値はその点の高度を表します。それぞれの極小値とその影響範囲は集水域と呼ばれ、集水域の境界は流域を形成します。流域の概念と形成は、浸漬プロセスをシミュレーションすることで説明できます。各極小値の表面に小さな穴を開け、モデル全体をゆっくりと水に浸し、浸漬が深くなるにつれて、極小値の表面上の各極小値の影響領域がゆっくりと外側に向かって拡大し、ダムを築きます。それぞれの極小値の影響範囲は、下図のように 2 つの集水域の合流点にダムを建設し、流域を形成します。流域変換は、異なる水系排水を通じて領域を分離し、画像に示すような画像を実現します。つまり、流域を形成します。流域変換は、さまざまな水系排水を通じて領域を分離し、画像セグメンテーションの目的を達成します。

5. リファレンスコードと拡張コードのフローチャート

(1) リファレンスコードのフローチャート

 

(2) 拡張コードのフローチャート

 

6. 参考コード

リファレンス コードは、画像しきい値セグメンテーション、数学的形態フィルタリング、エッジ トラッキング、フーリエ描画サブ計算、および
再建。
Image1=im2double(imread('plane.jpg'));
gray=rgb2gray(Image1);
T=graythresh(gray);%使用 Otsu 方法获取阈值,T 被归一化到[0,1]区间。
BW=im2bw(gray,T);%以 T 为阈值把灰度图像 I 转变为二值图像。
figure,imshow(BW),title('二值化图像');
SE=strel('square',3);%创建一个由square指定的结构元素,参数3控制 SE 的大小。
Morph=imopen(BW,SE); %对图像BW进行开运算,返回图像为Morph,SE是结构元素
Morph=imclose(Morph,SE);
figure,imshow(Morph),title('形态学滤波');
[B L]=bwboundaries(1-Morph);%搜索二值图像BW的外边界和内边界
figure,imshow(L),title('划分的区域');
hold on;
for i=1:length(B)
 boundary=B{i};
 plot(boundary(:,2),boundary(:,1),'r','LineWidth',2);
end
M=zeros(length(B)); 
for k=1:length(B) 
 N=length(B{k}); 
 if N/2~=round(N/2) 
 B{k}(end+1,:)=B{k}(end,:); 
 N=N+1;
 end
 M(k)=[N*3/4]; 
end
S=zeros(size(Morph)); 
figure,imshow(S);
hold on;
for k=1:length(B) 
 z=B{k}(:,2)+1i*B{k}(:,1); 
 Z=fft(z); 
 [Y I]=sort(abs(Z)); 
 for count=1:M(k) 
 Z(I(count))=0; 
 end
 zz=ifft(Z);%对Z进行IDFT 运算。 
 plot(real(zz),imag(zz),'w'); 
end
プログラム動作の効果は次のとおりです。

 

7. 実験要件

1. Matlab関数に精通しており、参照コードを理解している。
2.コンテンツを展開します。

( 1 ) グレースケール画像の 2 値化を実現するために、さまざまなしきい値選択方法を試してください。

コード:

I=imread('plane.jpg');
%人工选定阈值进行分割,选择阈值为150
[width,height]=size(I);
T1=150;
for i=1:width
    for j=1:height
        if(I(i,j)<T1)
            BW1(i,j)=0;
        else 
            BW1(i,j)=1;
        end
    end
end
BW2 = im2bw(BW1);
figure;imshow(BW2),title('人工阈值进行分割');

操作結果:

 

 

(2) 形態学的フィルタリングを実現するためにパラメータを変換し、フィルタリング効果を確認する

コード:


Image1=im2double(imread('plane.jpg'));
gray=rgb2gray(Image1);
T=graythresh(gray);
BW=im2bw(gray,T);
figure,imshow(BW),title('二值化图像');
SE=strel('disk',3);
Morph=imopen(BW,SE);
Morph=imclose(Morph,SE);
figure,imshow(Morph),title('形态学滤波');

操作結果:

 

(3) 再構成境界点の数を変更して効果を確認する

コード:

Image1=im2double(imread('plane.jpg')); 
gray=rgb2gray(Image1); 
T=graythresh(gray); 
BW=im2bw(gray,T); 
[B L]=bwboundaries(1-BW); 
figure,imshow(L),title('划分的区域'); 
hold on; 
for i=1:length(B) 
boundary=B{i}; 
plot(boundary(:,2),boundary(:,1),'r','LineWidth',1); 
end 
M=zeros(length(B),4); 
for k=1:length(B) 
N=length(B{k}); 
if N/2~=round(N/2) 
B{k}(end+1,:)=B{k}(end,:); 
N=N+1; 
end 
M(k,:)=[N/2 N*7/8 N*15/16 N*63/64]; 
end 
S=zeros(size(Morph)); 
for m = 1:4 
figure,imshow(S); 
hold on; 
for k=1:length(B) 
z=B{k}(:,2)+1i*B{k}(:,1);Z=fft(z); 
[Y I]=sort(abs(Z)); 
for count=1:M(k,m) 
Z(I(count))=0; 
end 
zz=ifft(Z); 
plot(real(zz),imag(zz),'w'); 
end 
end 

操作結果:

 

(4) 画像の分割を実現し、分割された領域の関連パラメータを計算するための独自設計の方法

コード:

img=imread('plane.jpg');
subplot(2,3,1);
imshow(img);
C = makecform('srgb2lab');       %设置转换格式
img_lab = applycform(img, C);
 
ab = double(img_lab(:,:,2:3));    %取出lab空间的a分量和b分量
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);
 
nColors = 3;        %分割的区域个数为3
[cluster_idx cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean','Replicates',3);  %重复聚类3次
pixel_labels = reshape(cluster_idx,nrows,ncols);
subplot(2,3,2);
imshow(pixel_labels,[]), title('聚类结果');
 
 
%显示分割后的各个区域
segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);
 
for k = 1:nColors
    color = img;
    color(rgb_label ~= k) = 0;
    segmented_images{k} = color;
end
subplot(2,3,3);
imshow(segmented_images{1}), title('分割结果——区域1');
subplot(2,3,4);
imshow(segmented_images{2}), title('分割结果——区域2');
subplot(2,3,5);
imshow(segmented_images{3}), title('分割结果——区域3');

操作結果:

 

おすすめ

転載: blog.csdn.net/m0_67463447/article/details/124554569