實驗要求
(1.a) 編寫一個以2 的冪次方將給定圖像的灰度級數從256 減少到2 的程序。圖像的灰度級數以參數變量的形式傳遞到所編寫的程序中。
(1.b) 使用圖2.21(a) 以(1.a)中編寫的程序生成圖2.21 所示的各個結果。
(2.a) 編寫一個基於像素複製方式進行圖像縮放的程序,假設縮放因子爲整數。忽略混疊效應。
(2.b) 用編寫的程序將圖2.19 (a)從1024 x 1024 縮小到 256 x 256。
(2.c) 用編寫的程序將(2.b)中的結果圖像放大到1024 x 1024. 並解釋與原圖產生差異的原因。
(3.a) 編寫一個以雙線性插值技術進行圖像縮放的程序,程序的輸入參數爲結果圖像的水平和垂直方向的像素數。忽略混疊效應。
(3.b) 用編寫的程序將圖2.19 (a)從1024 x 1024 縮小到 256 x 256。
(3.c) 用編寫的程序將(3.b)中的結果圖像放大到1024 x 1024. 並解釋與原圖產生差異的原因。
技術論述
1、 圖像灰度級變化
灰度圖像是一種具有從黑到白256級灰度色階或等級的單色圖像。該圖像中的每個像素用8位數據表示,因此像素點值介於黑白間的256種灰度中的一種。該圖像只有灰度等級,而沒有顏色的變化。
灰度即色階或灰階,又稱中間色調,是指亮度的明暗程度。圖像灰度級指圖像中的色度分量亮度的最大值與最小值之差的級別,級數越多,圖像亮度範圍就越豐富,圖像質量越好,反之,級數越少時圖像質量越差。當圖像只有2個灰度色階時,稱之爲二值圖像。
本實驗中,將給定圖像的灰度級數以2的冪次方從256減少到2,所採用量化方法爲:
2、 像素複製方法
圖像縮放中,像素複製方法的原理是對原來輸入圖像的整行或是整列像素進行簡單的複製與刪除,達到改變圖像大小的目的。該方法計算量小、運算速度快,但容易產生失真,不適合處理具有大量細節的圖像。
3、雙線性插值技術
雙線性插值又稱雙線性內插,當圖像放大時,結果圖像中新的像素值,是由原圖像像素位置的臨近點像素值通過加權平均計算得出的。
當對相鄰四個像素點採用雙線性插值時,所得表面在鄰域處是吻合的,但斜率不吻合,並且雙線性灰度插值的平滑作用可能使得圖像的細節產生退化,這種現象在進行圖像放大時尤其明顯。
雙線性插值的運算量比像素複製方法大,但是其處理結果更接近於原圖像的細節。
實驗結果
實驗程序
% 主函數
% 灰度級數降低
f0 = imread('Fig2.21(a).jpg'); % CT投影圖像
subplot(2,4,1);imshow(f0);title('Fig2.21(a)原圖像'); % 顯示原圖像
for i = 1:7
subplot(2,4,i+1);
imshow(grayleveldec(f0,i)); % for循環顯示灰度級降低後的圖像
title(sprintf("%d級灰度圖像", 2^(8-i)));
end
% 像素複製
f = imread('Fig2.19(a).jpg'); % 玫瑰圖像
f_shrink = pixel_duplication(f,-4); % 圖像縮小:像素複製
f_zoom = pixel_duplication(f_shrink ,4); % 圖像放大:像素複製
figure;imshow(f);title('Fig2.19(a)原圖像');
figure;imshow(f_shrink);title('像素複製縮小');
figure;imshow(f_zoom);title('像素複製放大');
% 雙線性插值
f1_shrink = bilinear(f,256,256); % 圖像縮小:雙線性插值
f1_zoom = bilinear(f1_shrink,1024,1024); % 圖像放大:雙線性插值
figure;imshow(f1_shrink);title('雙線性插值縮小');
figure;imshow(f1_zoom);title('雙線性插值放大');
function imt = grayleveldec(ima,factor)
%功能: 將原圖像的灰度級按照2的foctor次冪減少
if factor < 0
factor = 0;
end
if factor > 8
factor = 8
end
dfact = uint8(power(2, factor));
imt = (ima / dfact) * dfact; % 取整量化
return;
function img_duplication = pixel_duplication(img_input,factor)
% 像素複製方法
[M,N] = size(img_input);
if factor == 0 % 圖像不進行縮放
img_duplication = img_input;
elseif factor > 0 % 圖像放大
for i = 1 : M * factor
for j = 1 : N * factor
img_duplication(i,j) = img_input(ceil(i/factor),ceil(j/factor));
% 像素座標下標從1開始而非0,故需要向上取整即使用ceil(x)函數
end
end
else % 圖像縮小
for i = 1 : M / abs(factor)
for j = 1 : N / abs(factor)
img_duplication(i,j) = img_input(i*abs(factor),j*abs(factor));
end
end
end
end
function img_bilinear=bilinear(img_input,x_pixel,y_pixel)
% 雙線性插值
[M,N]=size(img_input); % 圖像的行數列數
img_input=double(img_input); % 轉換爲雙精度類型
n = x_pixel/M; % 縮放因子
% 爲解決邊界溢出問題,擴大原圖像的四邊邊緣
img_temp= zeros(M+2,N+2);
img_temp(2:M+1,1) = img_input(:,1); % 左邊,長度M
img_temp(2:M+1,N+2) = img_input(:,N); % 右邊,長度M
img_temp(2:M+1,2:N+1) = img_input(:,:); % 中間,圖像複製
img_temp(1,:) = img_temp(2,:); % 上邊,長度N+2
img_temp(M+2,:) = img_temp(M+1,:); % 下邊,長度N+2
M1 = round((M+2)*n); % 計算加邊後縮放的圖像的行數
N1 = round((N+2)*n); % 計算加邊後縮放的圖像的列數
img_res = zeros(M1,N1);
for i=round(n+1):round(x_pixel+n)
for j=round(n+1):round(y_pixel+n)
x=i/n; % 縮放後的圖像座標在原圖像處的位置
y=j/n;
u=x-floor(x);
v=y-floor(y);
img_res(i,j)=u*v*img_temp(x-u,y-v)+(1-u)*v*img_temp(x-u,y-v+1)+...
u*(1-v)*img_temp(x-u+1,y-v)+(1-v)*(1-u)*img_temp(x-u+1,y-v+1);
end
end
img_bilinear=img_res(n+1:x_pixel+n,n+1:y_pixel+n);
img_bilinear=uint8(img_bilinear);
end