1. 程式人生 > >【matlab程式碼練習10】影象增強相關的若干程式碼

【matlab程式碼練習10】影象增強相關的若干程式碼

一、函式brighten()的使用

% 通過函式brighten()調整影象的亮度
% 在MATLAB中還可以通過函式brighten()改變灰度影象的亮度。
% 在使用函式brighten()改變影象的亮度時,通常放到影象顯示函式imshow()的後面。
% brighten(beta):該函式改變影象的亮度,如果0<beta<1,則影象變亮,如果-1<beta<0,則影象變暗

close all; clear all; clc; 
orgin_image = imread('cameraman.tif'); 
figure, imshow(orgin_image); 
brighten(0.6); 
figure, imshow(orgin_image); 
brighten(-0.6); 

% 函式brighten()只是改變了影象的顯示效果,並沒有實際改變影象的畫素值。

二、通過函式stretchlim()和函式imadjust()進行影象增強

% 通過函式stretchlim()和函式imadjust()進行影象增強
% 在利用函式imadjust()進行灰度影象增強時,可以採用函式stretch()計算灰度影象的最佳輸入區間。
% 即函式imadjust[I,[low_in high_in], [low_out high_out]]中的第2個引數。
% 如果第2個引數為最佳輸入區間,則影象的灰度對比度最大。

close all; clear all; clc; 
I = imread('pout.tif'); 
M = stretchlim(I);  % 獲取最佳輸入區間
J = imadjust(I, M, []); 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

三、通過函式imcomplement()進行灰度影象的反轉變換

% 通過函式imcomplement()進行灰度影象的反轉變換
close all; clear all; clc; 
I = imread('glass.png'); 
J = imcomplement(I); 
figure; 
subplot(121), imshow(I); 
subplot(122), imshow(J); 

四、實現灰度影象的反轉變換

% 實現灰度影象的反轉變換
close all; clear all; clc; 
I = imread('glass.png'); 
[row column] = size(I); 
J = zeros(row, column); 
for i = 1:row
   for j = 1:column
      J(i,j) = 255 - I(i,j);  
   end
end
subplot(121), imshow(I); 
subplot(122), imshow(J, []); 

五、通過函式imhist()計算和顯示灰度影象的直方圖

% 通過函式imhist()計算和顯示灰度影象的直方圖
close all; clear all; clc; 
I = imread('pout.tif'); 
figure; 
subplot(121), imshow(I); 
subplot(122), imhist(I); 
axis tight; % 使座標系的最大值和最小值與你的資料範圍一致

六、通過函式imhist()計算RGB彩色影象的顏色直方圖

% 通過函式imhist()計算RGB彩色影象的顏色直方圖
close all; clear all; clc; 
I = imread('onion.png'); % 讀入RGB彩色影象
figure; 
subplot(141), imshow(I); 
subplot(142), imhist(I(:, :, 1)), title('R');  % 計算R分量的直方圖
subplot(143), imhist(I(:, :, 2)), title('G');  % 計算G分量的直方圖
subplot(144), imhist(I(:, :, 3)), title('B');  % 計算B分量的直方圖

七、通過函式imhist()計算彩色影象的HSV分量直方圖

% 通過函式imhist()計算彩色影象的HSV分量直方圖
close all; clear all; clc;
I = imread('football.jpg'); % 讀入RGB彩色影象
J = rgb2hsv(I); % 將RGB彩色影象轉換為HSV影象
figure; 
subplot(141), imshow(I); 
subplot(142), imhist(J(:, :, 1)); % 計算H分量的直方圖
title('H'); 
subplot(143), imhist(J(:, :, 2)); % 計算S分量的直方圖
title('S');
subplot(144), imhist(J(:, :, 3)); % 計算V分量的直方圖
title('V');

八、通過函式histeq()對影象進行直方圖均衡化處理

% 通過函式histeq()對影象進行直方圖均衡化處理
close all; clear all; clc; 

I = imread('pout.tif');  % 讀入原始影象
J = histeq(I); % 直方圖均衡化

figure; 
subplot(121), imshow(I); % 顯示原始影象
subplot(122), imshow(J); % 顯示直方圖均衡化後的影象

figure; 
subplot(121), imhist(I); % 原始影象的直方圖
axis tight; 
subplot(122), imhist(J); % 處理後圖像的直方圖
axis tight; 

九、通過函式histeq()對影象進行直方圖規定化處理

% 通過函式histeq()對影象進行直方圖規定化處理

close all; clear all; clc;

I = imread('tire.tif'); 
hgram = ones(1, 256); 
J = histeq(I, hgram); 

figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J); 
subplot(133), imhist(J); 
axis tight; 

十、通過函式mean2()計算灰度影象或彩色影象的平均值

close all; clear all; clc; 

orginal_image = imread('onion.png'); 
gray_image = rgb2gray(orginal_image); 
gray_mean = mean2(gray_image);
rgb_mean = mean2(orginal_image); 
r_mean = mean2(orginal_image(:, :, 1));
g_mean = mean2(orginal_image(:, :, 2));
b_mean = mean2(orginal_image(:, :, 3));  

十一、計算灰度影象的標準差

% 計算灰度影象的標準差
close all; clear all; clc; 

I = imread('pout.tif'); 
std_I = std2(I); 
J = histeq(I); 
std_J = std2(J); 

十二、計算兩個灰度影象的相關係數

% 計算兩個灰度影象的相關係數
close all; clear all; clc; 

I = imread('pout.tif'); 
J = medfilt2(I); % 中值濾波

score = corr2(I, J); 

figure;
subplot(121), imshow(I); 
subplot(122), imshow(J);

十三、通過函式imcontour()計算灰度影象的等高線

% 通過函式imcontour()計算灰度影象的等高線
close all; clear all; clc; 

I = imread('finger.png');
% gray_image = rgb2gray(rgb_image); 

figure; 
subplot(121), imshow(I); 
subplot(122), imcontour(I); 

十四、通過函式imfilter()對影象進行平滑

% 通過函式imfilter()對影象進行平滑
close all; clear all; clc; 

I = imread('finger.png'); 
J = imnoise(I, 'salt & pepper', 0.02); 
h = ones(3,3) / 5; 
h(1,1) = 0; 
h(1,3) = 0; 
h(3,1) = 0; 
h(3,3) = 0; 
K = imfilter(J, h); 

figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J); 
subplot(133), imshow(K);

十五、通過函式conv2()對影象進行平滑

% 通過函式conv2()對影象進行平滑

close all; clear all; clc; 

I = im2double(imread('finger.png')); 
J = imnoise(I,'gaussian', 0, 0.01); 
h = ones(3,3) / 9; 
K = conv2(J,h); 

figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J); 
subplot(133), imshow(K);

十六、通過函式filter2()進行二維線性數字濾波

% 通過函式filter2()進行二維線性數字濾波,採用函式fspecial()產生濾波器模板

close all; clear all; clc; 
I = im2double(imread('finger.png')); 
J = imnoise(I, 'salt & pepper', 0.02); 
h1 = fspecial('average', 3); 
h2 = fspecial('average', 5); 
K1 = filter2(h1, J); 
K2 = filter2(h2, J); 
figure; 
subplot(131), imshow(I); 
subplot(132), imshow(K1); 
subplot(133), imshow(K2); 

十七、通過函式medfilt2()對影象進行中值濾波

% 通過函式medfilt2()對影象進行中值濾波

close all; clear all; clc; 

I = im2double(imread('finger.png')); 
J = imnoise(I, 'salt & pepper', 0.03);
K = medfilt2(J); 

figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J); 
subplot(133), imshow(K);

可以看出,中值濾波處理帶有椒鹽噪聲的影象效果是很好的。

十八、通過函式ordfilt2()對影象進行排序濾波

% 通過函式ordfilt2()對影象進行排序濾波
close all; clear all; clc; 

I = im2double(imread('finger.png'));  % 讀入影象

J1 = ordfilt2(I, 1, true(5)); 
J2 = ordfilt2(I, 25, true(5));

figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J1); % 顯示排序後第1個作為輸出的結果
subplot(133), imshow(J2); % 顯示排序後第25個作為輸出的結果

十九、通過函式wiener2()對影象進行自適應濾波

% 通過函式wiener2()對影象進行自適應濾波
close all; clear all; clc; 

I = im2double(imread('finger.png')); 

J = imnoise(I, 'gaussian', 0, 0.01); 
K = wiener2(J, [5 5]); % 自適應濾波

figure; 
subplot(131), imshow(I); 
subplot(132), imshow(J);
subplot(133), imshow(K); 

二十、通過拉普拉斯運算元對影象進行銳化濾波

% 通過拉普拉斯運算元對影象進行銳化濾波
close all; clear all; clc; 

% I = im2double(imread('finger.png')); % 讀入影象
I = im2double(imread('rice.png')); % 讀入影象
h = [0,1,0; 1,-4,1; 0,1,0]; % 拉普拉斯運算元
J = conv2(I, h, 'same');  % 通過卷積對影象進行銳化濾波
K = I - J; 

figure; 
subplot(131), imshow(I,[]);
subplot(132), imshow(J,[]); 
subplot(133), imshow(K,[]); 

二十一、利用理想低通濾波器對影象進行濾波

% 利用理想低通濾波器對影象進行濾波
% 由實驗結果可見,理想低通濾波器去掉了影象中的高頻部分,影象的邊緣變得模糊

close all; clear all; clc; 

I = im2double(imread('coins.png')); 
M = 2*size(I,1); % M=492
N = 2*size(I,2); % N=600
u = -M/2 : (M/2 - 1); % u = -246 : 245
v = -N/2 : (N/2 - 1); % v = -300 : 299
[U, V] = meshgrid(u,v); % U是一個600*492的矩陣,V是一個600*492的矩陣

D = sqrt(U.^2 + V.^2); 
D0 = 80; % D0是理想低通濾波器的截止頻率
H = double(D<=D0); % 理想低通濾波器
J = fftshift(fft2(I, size(H,1), size(H,2))); % 時域影象轉換到頻域,fft2()是二維快速傅立葉變換,fftshift()將零頻分量移到頻譜中心
K = J.*H; %濾波處理
L = ifft2(ifftshift(K)); % 傅立葉反變換+逆零頻平移,即fftshift()的反向操作
L = L(1:size(I,1), 1:size(I,2)); 

figure;
subplot(121), imshow(I,[]); 
subplot(122), imshow(L,[]);

二十二、利用巴特沃斯低通濾波器對影象進行濾波

% 利用巴特沃斯低通濾波器對影象進行濾波
% 通過低通濾波器後,去除了影象的高頻部分,影象的邊緣變得模糊

close all; clear all; clc; 

I = im2double(imread('liftingbody.png')); 

M = 2*size(I,1); 
N = 2*size(I,2); 
u = -M/2 : (M/2 - 1); 
v = -N/2 : (N/2 - 1);   
[U, V] = meshgrid(u,v); 

D = sqrt(U.^2 + V.^2); 
D0 = 50; 
n = 6; 
H = 1 ./ (1 + (D./D0).^(2*n)); 
J = fft2(I, size(H,1), size(H,2)); 
J = fftshift(J); 
K = J.*H; 
L = ifftshift(K);
L = ifft2(L); 
L = L(1:size(I,1), 1:size(I,2)); 

figure; 
subplot(121), imshow(I,[]);
subplot(122), imshow(L,[]);