目次
(1) グレースケール画像の二値化を実現するために、さまざまなしきい値選択方法を試してください。
(2) 形態学的フィルタリングを実現するためにパラメータを変換し、フィルタリング効果を確認する
(4) 画像の分割を実現し、分割された領域の関連パラメータを計算するための独自設計の方法
1. 実験の意義と目的
2. 実験内容
3. Matlab関連機能の紹介
ifft2(F) : Fに対して2 次元IDFT演算を実行します。
4. アルゴリズム原理
画像セグメンテーションとは、画像を特定の特性を持つさまざまな領域に分割する画像処理技術を指します。これらの領域を抽出してさらに特徴を抽出することは、画像処理から画像分析までの重要なステップです。画像セグメンテーションはその重要性から、画像処理分野において常に研究の焦点となってきました。閾値分割法は、画像の濃淡値の分布特性に応じて一定の閾値を決定して画像を分割する方法である。元のグレースケール画像をf ( x , y ) とし、ある基準によってしきい値としてグレースケール値Tを選択し、各ピクセル値とTの関係を比較します。ピクセル値がT以上のピクセルは1つのクラスに分類され、変更される画素値は1であり、画素値がT未満の画素は別の種類であり、その画素値は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 ) グレースケール画像の 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');
操作結果: