图像处理作业ch2

图像处理第二章作业

题目

  • 用程序实现同时对比度实验
  • 用程序实现空间分辨率变化效果
  • 用程序实现幅度分辨率变化效果

实验代码、结果及其分析

1.对比度实验

代码

% contrast.m
clear;
background_size_x = 512;
background_size_y = 512;
frontground_size_x = 128;
frontground_size_y = 128;
frontground = 128;
background1 = frontground + 64;
background2 = frontground - 64;
X = ones(background_size_x,background_size_y) * background1;
X(background_size_x/2 - frontground_size_x/2:background_size_x/2 + frontground_size_x/2,background_size_y/2 - frontground_size_y/2:background_size_y/2 + frontground_size_y/2) = frontground;
figure(1);
imshow(uint8(X));
X = ones(background_size_x,background_size_y) * background2;
X(background_size_x/2 - frontground_size_x/2:background_size_x/2 + frontground_size_x/2,background_size_y/2 - frontground_size_y/2:background_size_y/2 + frontground_size_y/2) = frontground;
figure(2);
imshow(uint8(X));

结果

contrast.jpg

contrast1.jpg

分析

结合得到的图片和代码可知,前景灰度值相同而背景灰度值不同时,人眼的视觉效果对前景的观察效果不同。当背景灰度值较高时,前景看起来感觉比背景灰度值较低时要更加亮,也就是看起来灰度值较低。由此我们应该知道,虽然在一幅图像中我们关注的是前景,但是背景对前景的显示是有影响的。

2.空间分辨率实验

代码

% resolution.m
clear;
X = imread('image1.jpg');
X = rgb2gray(X);% 由于使用的是彩色图,这里需要rgb转灰度图
[img_size_y,img_size_x] = size(X);
for i = 0:8
    step = 2^(i);
    X1 = X(1:step:img_size_y,1:step:img_size_x);
    subplot(3,3,i+1);
    imshow(uint8(X1));
    title([num2str(img_size_y/step),'x',num2str(img_size_x/step)])
end

结果

resolution1.jpg

分析

代码中利用9次的循环实现了同一张图片在9个不同空间分辨率下的显示情况。图片原大小为1024*1024,从结果中我们可以看见,一直到把大小缩小为128*128的时候,图像都较为清晰,而64*64的图像已经开始出现可见的不清晰的“马赛克”但仍然能辨认出图像内容,到32*32的大小已经不是特别能看得出图像内容了,与前面的图像对比还稍微能看得出,但是到了16*16大小的图片已经完全看不出来了,更不用说后面的8*8和4*4了。从此我们可以知道,在不损失主要信息的情况下我们可以对图像空间分辨率进行缩小以节省存储空间,但是结合现实生活应用来说,其实图像挑选合适的分辨率也与我们的显示设备和应用场景来选择的。比如笔者在编写app或者为博客网站选择图标的时候,因为显示范围是一定的,本来就不太大,所以图标不需要选择太大一般只会选择32*32或者64*64,这个时候看上去图标也十分清晰,但是如果是在手机或者电脑显示器上看视频或者图片的时候,我们就会希望空间分辨率更大一些,看起来就会更清晰。而有些在手机上看起来清晰的图片放到了电脑上由于显示器的大小不同,显示出来的实际大小在电脑屏幕上会比较大,这个时候看起来可能就没那么清晰了。

3.幅度分辨率

代码

% resolition.m
clear;
X = imread('image1.jpg');
X = rgb2gray(X);% 由于使用的是彩色图,这里需要rgb转灰度图
for i=1:9
    lv = 2^i;
    X1 = histeq(X,lv);
    subplot(3,3,i);
    imshow(X1);
    title([num2str(2^i),'x',num2str(2^i)])
end

结果

resolution2.jpg

分析

此处代码也是利用9次实验实现了不同灰度量化等级(也就是幅度分辨率)下的图片显示情况。从结果上看,从512*512(实际上原图应该也只是256*256,这里是为了九宫格图片美观而加多了一个512*512的图片)到32*32为止,图片看上去都没有太大的区别,而从16*16开始会看到明显的“色块”,图片中一些边界开始模糊,这里开始幅度分辨率越小,显示效果就急剧变差了,4*4图片已经基本不太能看了,2*2的图片就只剩下了完全的黑白,更加看不出来了。从此我们可以看到幅度分辨率对图片的影响和空间分辨率对图片的影响是十分不一样的,空间分辨率变小会使图片变得“模糊”,而幅度分辨率变小则是使图片的“色彩”(灰度)不够细致了,但无论是哪个,分辨率太小了会使图片含有的信息量太小,也没办法辨识出图片内容,但在可以辨别的情况下应该尽量的减小分辨率以节省存储空间。
这里另外说一下代码中使用的histeq函数,这是一个MATLAB自带的函数,用于调整灰度图片矩阵的灰度量化级别,实际上是对直方图的灰度级数进行改变,一般这个参数都是输入2的n次方,默认为64。我们知道imhist函数是用来获取灰度直方图的,而histeq实际上是对直方图做一个均衡,找到所有对应灰度的像素,根据一定的对应关系把这些像素的灰度级别进行对应改变,或是扩展,或是缩减。最简单的一个方式就是对所有的像素灰度值都除一个数(需要是2的n次方)之后用ceil或者floor函数舍弃比较小的位数,再乘回这个数就能达到简单的降低幅度分辨率的目的。下面是本次实验使用图片的灰度直方图,用以参考。

imhist.jpg

总结和感想

这次的实验虽然比较简单,但是对于刚刚入门该领域的笔者来说,这三个实验让笔者对于图像处理有了一个很好的理解,由于笔者以前经常使用Photoshop,虽然懂得怎么使用但是完全不了解图片处理的背后原理,这三个实验从入门角度我了解了当时使用的灰度图和压图是怎么一回事。而在第三个实验题目中,一开始不太想得到怎么实现想要的改变幅度分辨率效果,后来搜索了一点相关资料之后了解到了histeq函数已经背后的实现原理后对幅度分辨率有了进一步的了解,也对第三章暂时学习到的内容有了一个连接,感觉知识更加有整体性了。

附录

这里附上搜索到的histeq实现函数原理代码:详情可以查看这篇博客这篇博客

clc;clear;closeall;

H=imread('pout.tif');figure;subplot(121);imshow(H);%图像应该是灰度图,若图像为彩色图,需要对每个通道进行计算

H=im2double(H);%这个是需要注意的地方,一定要变换成double类型

[MN]=size(H);

[counts,x]=imhist(H);%H是读取的图像,imhist是对图像直方图进行统计,其中count,是每个灰度值得个数,x代表灰度值。一般的,x=1:256

location=find(counts~=0);%找到所有像素个数不为0的灰度级

MinCDF=min(counts(location));%找到包含个数最少的灰度级

for j=1:length(location)

   CDF=sum(counts(location(1:j)));%计算各个灰度级像素个数累计分布

   P=find(H==x(location(j)));%找到图像中等于某个灰度级所有像素点所在位置

   H(P)=(CDF-MinCDF)/(M*N-MinCDF);%%利用灰度换算公式,修改所有位置上的像素值

end

subplot(122);imshow(H)

print(gcf,'-djpeg',['1.jpg']);   % 保存为jpg格式的图片。
f=imread('tire.tif');

[m,n]=size(f);
f1=im2uint8(ones(m,n));

h=imhist(f);
I=length(h);

%概率密度
fx=h/numel(f);

%分布函数
FX=cumsum(fx);

%获得均衡化之后的灰度直方图
j=FX.*256;
J=round(j);%由于灰度级为1-256之间的整数,
%故需对拓展之后的灰度灰度级数取整才有意义。

%将拓展后的的灰度级数对应映射到图片中。

%由于灰度级数为1-256之间的整数,故需对扩展之后的灰度级数取整才有意义,
%得到的J矩阵为1X256大小,表示扩展之前的灰度级数,其中每个级数对应元素的值为该灰度级数扩展后的灰度级数值。
%如J(2)=24,表示原始度直方图为2灰度值的地方经灰度扩展后其灰度值为24
for  i=1:I  %I=256
    old=find(J==i); %找出扩展后的级数对应的扩展前的级数
    L=length(old);
    for k=1:L %m每一个n*n的
         oldlocation=find(f==(old(k)-1));%找到拓展前的灰度级数对应的像素点
        f1(oldlocation)=i;
    end
end
subplot(1,2,1),imhist(f1)
subplot(1,2,2),imshow(f1);

猜你喜欢

转载自www.cnblogs.com/yokingyoking/p/12470032.html