【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)

实验要求

(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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章