【数字图像处理】Image Printing Program Based on Halftoning

实验要求:

本实验后面的图像给出了用点模式近似表示的 10 个灰度级。每一个灰度级用一个 3 x 3 的黑白点模式表示。用黑点全部填充的 3 x 3 区域近似表示灰度级为 0 的黑色灰度级,全部填充白点的 3 x 3 模式近似表示灰度级为9 的白色灰度级。其它的点模式表示这二者之间的灰度级。基于这样的点模式的灰度级打印方案称为半色调技术。 亦即输入图像中的每一个像素将对应于打印图像中的 3 x 3 个像素, 这样在水平和垂直方向上的空间分辨率将减少为原始图像的 33%。实验中原始图像尺度分辨率是否减小依赖于输入图像的尺寸,如下面(a)中所述。(a) 编写一个使用上述点模式的半色调技术打印灰度图像的程序。要求程序可以对输入图像的尺度(尺寸)进行调整,以便使打印图像不超出 A4 纸(21.6 x 27.9 cm)的打印区域;要求程序在打印输出以前将输入图像的灰度级范围变换到半色调的整个灰度范围。(b) 编写一个生成尺寸为 256 x 256 大小的渐变测试图像的程序。输出图像第 1 列像素灰度为 0,第 2 列像素灰度为 1,以此类推,最后 1 列像素灰度为 255。使用(a)中编写的灰度图像打印程序打印该图。(c) 使用(a)中编写的灰度图像打印程序打印课本图 2.22(a)到(c)。打印结果是否符合课本图 2.23 给出的结论? 并给出解释。

实现代码:

主函数:
% 主函数
clc
clear;
close all;
 
gradient_img = gradient_img();                              % 生成渐变测试图像
ht_change = halftoning(gradient_img);                       % 半色调打印
figure;imshow(gradient_img);title('图像1:渐变测试图像');     % 显示图像
figure;imshow(ht_change);title('图像2:渐变图像半色调打印');
 
f1 = imread('Fig2.22(a).jpg');                              % 读取图像
[m1,n1]=size(f1)
figure;imshow(f1);title('图像3:2.22(a)');          % 妇女脸庞图像
ht_img1 = halftoning(f1);  
figure;imshow(ht_img1);title('图像4:a图像半色调打印');
 
f2 = imread('Fig2.22(b).jpg');
[m2,n2]=size(f2)
figure;imshow(f2);title('图像5:2.22(b)');          % 摄影师图像
ht_img2 = halftoning(f2);
figure;imshow(ht_img2);title('图像6:b图像半色调打印');
 
f3 = imread('Fig2.22(c).jpg');
[m3,n3]=size(f3)
figure;imshow(f3);title('图像7:2.22(c)');          % 人群图像
ht_img3 = halftoning(f3);
figure;imshow(ht_img3);title('图像8:c图像半色调打印');

半色调打印函数程序:
%半色调打印
function Image_Halftoning = halftoning(Image,pixel)
 
% File Name :Image Printing Program Based on Halftoning
% Created   : Created by Yuan Weijian on 2018.10.18
% pixel     :分辨率是72像素/英寸时,A4纸的尺寸的图像的像素是595×842;
%              分辨率是96像素/英寸时,A4纸的尺寸的图像的像素是794×1123;(默认)
               分辨率是150像素/英寸时,A4纸的尺寸的图像的像素是1240×1754   
 
[M,N] = size(Image);                   % 获取原始图像尺寸大小
 
if nargin == 2 && pixel == 150       % 如果输入图像分辨率为150,
%则输入图像尺寸小于等于413*585
    while ( M >=413 || N >=585 )         % 图片尺寸过大时缩小图片
        mscale=double(M)/264;
        nscale=double(N)/374;
        max_scale = max(mscale,nscale);
        scale = 1.0/(max_scale)
        Image=imresize(Image,scale);     % 调用函数imresize,scale为缩放因子
        [M,N] = size(Image);
end
 
elseif  nargin == 2 && pixel ==96
    while( M >=264 || N >=374 )  % 当分辨率为96像素/英寸,输入图像必须小于等于264*374
        mscale=double(M)/264;
        nscale=double(N)/374;
        max_scale = max(mscale,nscale);
        scale = 1.0/(max_scale)
         Image=imresize(Image,0.8);     % 调用函数imresize,其中scale为缩放因子
        [M,N] = size(Image);             % 获取调整后图像尺寸大小
    end
 
elseif  nargin == 1 && pixel ==72
    while( M >=198 || N >=280 )   % 当分辨率为27像素/英寸,输入图像必须小于等于198*280
        mscale=double(M)/198;
        nscale=double(N)/280;
        max_scale = max(mscale,nscale);
        scale = 1.0/(max_scale)
        Image=imresize(Image,0.8);      % 调用函数imresize,其中scale为缩放因子
        [M,N] = size(Image);             % 获取调整后图像尺寸大小
    end
else
    disp('输入错误');
    return;
end
 
% 构造点模式近似表示的10个灰度级
dot=zeros(3,3,10);                           % 3×3的10灰度级矩阵,0为黑色,255为白色
dot(:,:,1)=255.*[0 0 0;0 0 0;0 0 0];
dot(:,:,2)=255.*[0 1 0;0 0 0;0 0 0];
dot(:,:,3)=255.*[0 1 0;0 0 0;0 0 1];
dot(:,:,4)=255.*[1 1 0;0 0 0;0 0 1];
dot(:,:,5)=255.*[1 1 0;0 0 0;1 0 1];
dot(:,:,6)=255.*[1 1 1;0 0 0;1 0 1];
dot(:,:,7)=255.*[1 1 1;0 0 1;1 0 1];
dot(:,:,8)=255.*[1 1 1;0 0 1;1 1 1];
dot(:,:,9)=255.*[1 1 1;1 0 1;1 1 1];
dot(:,:,10)=255.*[1 1 1;1 1 1;1 1 1];
 
Image_Halftoning = zeros(M*3,N*3);         % 初始化输出图像
Image_Ten = graylevelconvert(Image);      % 灰度矩阵,fix函数为向0靠拢取整
for i = 1:M
    for j = 1:N                            % Image_Ten中元素为0~9,
graylevel = Image_Ten(i,j)+1;              % 而灰度级为1~10,故在此加一。
        Image_Halftoning((3*i-2):3*i,(3*j-2):3*j) = dot(1:3,1:3,graylevel);
    end
End

产生渐变图像程序:
% 创造gradient_img函数,生成一个尺寸为256 x 256 大小的渐变测试图像
function Gradient_img = gradient_img()
 
Gradient_img = zeros(256,256);                  
for i=1:256
    Gradient_img(:,i) = ones(256,1) * (i-1);       % 矩阵赋值,元素值为double类型
end
Gradient_img = uint8(Gradient_img);                % 图像改成uint8类型
imwrite(Gradient_img,'ganeral_img.jpg');
 
End

转换灰度级程序:
%灰度级转换函数graylevelconvert
function gray_ten = graylevelconvert(Image)
% Image_in为输入的8bit灰度级的图像矩阵,Image_out为10灰度级的图像矩阵
 
gray_ten = fix(double(Image) / 25.6) ;      %fix函数为向0靠拢取整
 
end

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值