画像処理
01基本的な画像処理
%%Matlab读取图片:
>> mat=imread('pic1.png');
>> imshow(mat)
>> size(mat)
ans =
906 947 3
画像変換機能:
•gray2ind-インデックスイメージへの強度イメージ
•im2bw-バイナリへのイメージ
•im2double-画像を倍精度に
•im2uint8-8ビットの符号なし整数へのイメージ
•im2uint16-16ビットの符号なし整数へのイメージ
•ind2gray-強度イメージへのインデックス付きイメージ
•mat2gray-強度イメージへの行列
•rgb2gray-RGBイメージからグレースケール
•rgb2ind-RGBイメージからインデックス付きイメージ
>> I=imread('pic1.png');
>> figure,imshow(I);
>> gI=rgb2gray(I);
>> [X,map]=gray2ind(gI,16);
>> figure,imshow(X,map);
>> figure,imshow(gI);
結果:
>> [X,map]=gray2ind(gI,8);
>> imshow(X,map)
>> [X,map]=gray2ind(gI,256);
>> imshow(X,map)
>> bI=im2bw(gI,0.5);
>> imshow(bI);
画像の追加:
>> I0=imread('pic3.png');
>> I1=imread('pic3-1.png');
>> I2=imread('pic3-2.png');
>> I3=imread('pic3-3.png');
>> figure,image(I1),truesize,title('I1-image'),xlabel('I1')
>> figure,image(I2),truesize,title('I2-image'),xlabel('I2')
>> figure,image(I3),truesize,title('I3-image'),xlabel('I3')
>> mI=uint8(double(I1)+double(I2)+double(I3));
>> figure,image(mI),truesize,title('mI-image'),xlabel('mI')
3つの不完全な画像をオーバーレイします。
結果:
強度変換:
>> aI2=imadjust(I0,[],[],0.5);
>> figure,imshow(aI2)
>> aI3=imadjust(I0,[],[],2);
>> figure,imshow(aI3)
>> aI1=imadjust(I0,[0,1],[1,0]);
>> figure,imshow(aI1)
結果:
統計ヒストグラム:
>> imhist(I0)
>> figure,imshow(I0)
画像ズーム:最近傍のリサンプリング
p=3;q=5;
I0=imread('pic3.png');
ii=1;
I1=zeros(round(size(I0,1)*p/q),round(size(I0,2)*p/q),3);
for i=1:q:size(I0,1)-1
jj=1;
for j=1:q:size(I0,2)-1
I1(ii:ii+p-1,jj:jj+p-1,:)=double(I0(i:2:i+q-1,j:2:j+q-1,:));
jj=jj+p;
end
ii=ii+p;
end
figure
image(I0)
% truesize
figure
image(uint8(I1))
% truesize
size(I0),size(I1)
画像の拡大:バイリニア補間
I=imread('pic1.png');
I=I0;
I0=double(I0);
I1=zeros(size(I0,1)*2,size(I0,2)*2,3);
[r,c]=meshgrid(1:size(I0,2),1:size(I0,1));
rc=linspace(1, size(I,1), size(I,1)*2);
cc=linspace(1, size(I,2), size(I,2)*2);
[r_new,c_new]=meshgrid(cc,rc);
rc=linspace(1, size(I0,1), size(I0,1)*2);
cc=linspace(1, size(I0,2), size(I0,2)*2);
[r_new,c_new]=meshgrid(cc,rc);
I1(:,:,1)=interp2(r,c,I0(:,:,1),r_new,c_new,'spline');
I1(:,:,2)=interp2(r,c,I0(:,:,2),r_new,c_new,'spline');
I1(:,:,3)=interp2(r,c,I0(:,:,3),r_new,c_new,'spline');
imshow(uint8(I1))
size(I1)
02画像ノイズ低減
ノイズの種類:ホワイトノイズ、塩コショウノイズなど
>> I0=imread('pic3.png');
figure,imshow(I0)
nI = imnoise(I0, 'salt & pepper', 0.01);
figure,imshow(nI)
nII = imnoise(I0, 'gaussian', 0.01);
figure,imshow(nII)
非線形フィルタリングのノイズ低減:平均フィルタリング
I=imread('pic3.png');
I0=rgb2gray(I);
nII = imnoise(I0, 'gaussian', 0.01);
aI=imfilter(nII,fspecial('average',[3,3]));
figure,imshow(nII),figure,imshow(aI)
I=imread('pic3.png');
I0=rgb2gray(I);
nII = imnoise(I0, 'salt & pepper', 0.01);
aI=imfilter(nII,fspecial('average',[3,3]));
figure,imshow(nII),figure,imshow(aI)
非線形フィルタリングのノイズ低減:平均フィルタリング
I=imread('pic3.png');
I0=rgb2gray(I);
nII = imnoise(I0, 'salt & pepper', 0.01);
k2=medfilt2(nII ,[5,5]);
figure,imshow(nII),figure,imshow(k2)
03画像端
ポイント検出:フィルター演算子を使用します:
異常なポイントを追加します。
I0=imread('pic3.png');
I0(100:105,800:808,:)=0;
figure,imshow(I0)
異常箇所の検出
w=[-1 -1 -1;-1 8 -1;-1 -1 -1];
g=abs(imfilter(I0,w));
T=max(g(:));
g=(g>=T);
imshow(uint8(g))
直線検出演算子:
f=imread('pic4.png');
figure,imshow(f);
w = [2 -1 -1; -1 2 -1;-1 -1 2 ];
g = imfilter(double(f),w);
figure,imshow(g)
gtop = g(1:120,1:120);
figure , imshow(gtop)
gbot = g(end-119:end, end-119:end);
figure,imshow(gbot)
g = abs(g);
figure,imshow(g)
T = max (g(:));
g = g >= T;
figure, imshow(g)
エッジ検出:勾配演算子:ラプラシアン
エッジ検出:勾配演算子:ソーベル演算子
エッジ検出:キャニー演算子
エッジ検出:2D ガウス演算子
I=imread('pic4.png');
I0=rgb2gray(I);
subplot(231);
imshow(I);
BW1=edge(I0,'Roberts',0.16);
subplot(232);
imshow(BW1);
title('Roberts')
BW2=edge(I0,'Sobel',0.16);
subplot(233);
imshow(BW2);
title('Sobel')
BW3=edge(I0,'Prewitt',0.16);
subplot(234);
imshow(BW3);
title('Prewitt');
BW4=edge(I0,'LOG',0.012);
subplot(235);
imshow(BW4);
title('LOG')
BW5=edge(I0,'Canny',0.2);
subplot(236);
imshow(BW5);
title('Canny');