数字图像处理:实验三

前言:

Matlab程序以及图片资源链接

一、采用灰度线性变换方法(g(x,y)=k*f(x,y)+d)对一幅图像(自定)进行对比度增强、亮度增加和求反三种图像灰度变换。要求呈现原始图像和灰度变换后图像,并对处理过程及处理结果进行说明;

Matlab程序:(2016a版本)


	clc;  
	clear;  
	close all;  
	% 对灰度图进行灰度线性变换  
	img = imread('hua.jpg');  
	img = rgb2gray(img);  
	%k大于1 增大图像的对比度,图像的像素值在变换后全部增大,整体效果被增强  
	k = 1.25;  
	d = 0;  
	gray1 = img * k + d;  
	%k等于1 通过调整b ,实现对图像亮度的调整  
	k = 1;  
	d = 50;  
	gray2 = img * k + d;  
	%k∈(0,1) 图像的对比度被削弱  
	k = 0.5;  
	d = 0;  
	gray3 = img * k + d;  
	%k小于0 原来图像亮的区域变暗,原来图像暗的区域变亮 取反  
	k = -1;  
	d = 255;  
	img_1 = im2double(img);  
	gray4 = img_1 * k + 1.0;  
	subplot(5,2,1),imshow(img),title('原图');  
	subplot(5,2,2),imhist(img),title('原图直方图');  
	subplot(5,2,3),imshow(gray1),title('k>0 d=0');%增大对比度  
	subplot(5,2,4),imhist(gray1),title('k>0 d=0直方图');  
	subplot(5,2,5),imshow(gray2),title('k=1 d=50');%调节亮度  
	subplot(5,2,6),imhist(gray2),title('k=1 d=50直方图');  
	subplot(5,2,7),imshow(gray3),title('k=0.5 d=0');%对比度削弱  
	subplot(5,2,8),imhist(gray3),title('k=0.5 d=0直方图');  
	subplot(5,2,9),imshow(gray4),title('k=-1 d=255');%取反  
	subplot(5,2,10),imhist(gray4),title('k=-1 d=255直方图');  

原始图像、处理后的图像:

在这里插入图片描述

处理的过程和结果的说明:

灰度线性变换就是将图像的像素值通过指定的线性函数进行变换,以此增强或者减弱图像的灰度。
灰度线性变换的公式就是常见的一维线性函数:
g(x,y)=k*f(x,y)+d
设x为原始灰度值,则变换后的灰度值y:
y=kx+d (0≤y≤255)
通过改变K与D的值就可以实现对图片进行线性灰度处理。通过程序运行后的结果我们可以看出:当k>1时,相对于原图花朵纹理更清晰增加图像的对比度,相对的当0<k<1时,图像对比度和整体效果都被消弱了。而当k=1时,通过调节D值可以调节图像的整体亮度。为了得到取反的图像配置k<0,发现得出的图像较之于原图像发生了明显的变化,其中原图像较亮的区域变暗,而较暗的区域会变亮,得到了类似照片负片的效果。

二、采用灰度阈值变换的方法对一幅图像进行目标图像与背景的二值显示,要求呈现原始图像和灰度阈值变换后图像,并对处理过程及处理结果进行说明;

Matlab程序:(2016a版本)

    %清空工作区  
	clc,clear,close all;  
	%读入原图像  
	img = imread('paizi.jpg');  
	imggray=rgb2gray(img);  
	%采用OTSU算法来获取全局阈值,自动选取阈值  
	img_i = graythresh(img);    
	Image2 = im2bw(img,img_i);%二值化  
	%人工选定阈值进行分割,选择阈值为观察直方图波峰所得  
	T1=70;  
	[width,height]=size(imggray);  
	Image1 = zeros(width,height);  
	for i=1:width  
	    for j=1:height  
	        if(imggray(i,j)<T1)  
	            Image1(i,j)=0;  
	        else   
	            Image1(i,j)=1;  
	        end  
	    end  
	end  
	subplot(3,2,1);imshow(img);title('原图');  
	subplot(3,2,2);imhist(imggray);title('原图直方图');  
	subplot(3,2,3);imshow(Image1),title('全局阈值分割效果图');  
	subplot(3,2,4);imhist(Image1);title('全局阈值分割直方图');  
	subplot(3,2,5);imshow(Image2),title('OTUS分割效果图');  
	subplot(3,2,6);imhist(Image2);title('OTUS分割直方图');  

原始图像、处理后的图像;

在这里插入图片描述

处理的过程和结果的说明:

查阅资料可知灰度直方图是关于灰度级分布的函数。灰度图像中画面比较简单且对象物的灰度分布比较有规律时,背景和对象物在图像的灰度直方图上各形成一个波峰,由于每两个波峰间形成一个低谷,因而选择双峰间低谷处所对应的灰度值为阈值,可将两个区域分离。基于这个原理,我们首先对图片进行转换,变为灰度图像,并将其输出为灰度直方图,通过观察灰度直方图选取较为明显的波峰之间的低谷值作为我们的手动阈值。
选取两种算法(全局阈值分割法、全局阈值Otsu法)来进行二值化分割。
全局阈值分割法:
在整个图像中只使用一个阈值,则这种方法叫做全局阈值法,整个图象分成两个区域,即目标对象(黑色)和背景对象(白色)。全局阈值将整个图像的灰度阈值设置为常数。这里我们根据直方图选择70为初始阈值进行处理。效果图说明该方法可行,将背景和广告牌子分割,并且牌子广告词清晰了;
Otsu算法
主要通过graythresh函数获取灰度阈值,接着使用im2bw函数将其二值化转换。
两种操作可以看出,Otsu算法明显处理的效果更好,对图片进行阈值化处理明显在像素值上比较分散化,比直方图单一阈值的全局分割效果有进一步的改进。

三、采分段灰度线性变换(如图3.1所示)对一幅图像(如图3.2)进行对比度增强。要求呈现原始图像和灰度变换后图像,并对处理过程及处理结果进行说明。

在这里插入图片描述

图3.1 分段线性变换
在这里插入图片描述

图3.2 原始图像

Matlab程序:(2016a版本)

	clc;clear;close all;  
	Image = im2double(rgb2gray(imread('zuoye.jpg')));  %读取并对图做处理  
	[h,w] = size(Image);        % 获取图像尺寸  h:height,高度;w:width 宽度  
	NewImage1 = zeros(h,w);      %  赋初值  
	NewImage2 = zeros(h,w);         
	NewImage3 = Image;             
	%确定abcd四个参数的值 
	a = 30/256;b = 100/256;c= 75/256;d= 200/256;             
	for x = 1 : w               % 最外层循环 宽度  
	    for y = 1 : h           % 内层循环   高度  
	        % 在灰度图像中 按列从上至下循环   
	        if Image(y,x)<a     %若(y,x)处值<a时   
	            NewImage1(y,x) = Image(y,x)*c/a;   
	        elseif Image(y,x)<b  % 若(y,x)处值<b时   
	            NewImage1(y,x) = (Image(y,x)-a)*(d-c)/(b-a)+c;  
	        else                 % 其他情况 做以下处理  
	            NewImage1(y,x) = (Image(y,x)-b)*(1-d)/(1-b)+d;  
	        end  
	        if Image(y,x)>a&& Image(y,x)<b    % 介于(a,b)之间  做下行处理  
	            NewImage3(y,x) = (Image(y,x)-a)*(d-c)/(b-a)+c;  
	        end  
	    end  
	end  
	NewImage2 = imadjust(Image,[a;b],[c;d]);     
	figure;  
	subplot(2,2,1);imshow(Image);title('原始图像');    
	subplot(2,2,3);imshow(NewImage1);title('分段线性灰度级变换图像');  
	subplot(2,2,2);imhist(Image);title('原始图像直方图');    
	subplot(2,2,4);imhist(NewImage1);title('分段线性灰度级变换图像直方图');  
	figure;  
	subplot(2,2,1);imshow(NewImage2);title('截断式灰度级变换图像');    
	subplot(2,2,3);imshow(NewImage3);title('高低灰度级保持不变图像');  
	subplot(2,2,2);imhist(NewImage2);title('截断式灰度级变换图像直方图');    
	subplot(2,2,4);imhist(NewImage3);title('高低灰度级保持不变图像直方图');  

原始图像、处理后的图像;

在这里插入图片描述
在这里插入图片描述

处理的过程和结果的说明;

在拍摄图像时曝光度不足或过度的情况下,图像灰度就有可能会局限在一个很小的范围内,这时看到的将会是一个模糊不清、没有灰度层次的图像。用一个线性单值函数,对图像内的每一个像素作线性扩展,将有效地改善图像视觉效果。
与线性灰度变换类似分段线性变换是分段进行线性变换,将图像灰度区间分为两段或者多段,分别作不同的线性变换。分段线性变换的目的是为了突出感兴趣的目标或灰度区间,相对抑制那些不感兴趣的灰度区域。变换可公式表示为:
在这里插入图片描述
f 为原始图像的灰度值,g为线性灰度变换后的图像灰度值;
编程思路:
首先读取并对图像做处理,获取图像尺寸,给几幅图赋初值用于后续存储。在确定abcd四个参数的值后,利用了两个循环嵌套对图像的数组进行遍历,实现分段函数的操作。接着根据不同的情况对于不同分段值进行对应操作。最后将结果分别用直方图显示出来。
实验分析:
已知abcd值的不同,可能会存在四种情况,分别是(y,x)处值<a、(y,x)处值<b、介于(a,b)之间以及其他情况,四种情况的斜率各不相同,而根据灰度值的变换规律可以知道
斜率影响图像的对比度,那么低灰度值的部分肯定被压缩,效果就是暗的部分更加暗,而且对比度更低,结果图像我们明显看出暗色的背景更加暗,而且结合直方图我们可以看出低灰度值部分向更低灰度值压缩。
与之对应的是高灰度值部分,我们可以由变换曲线可知此部分值增大,说明整体高灰度值部分向x轴右侧偏移,结果就是导致亮色的部分更加亮。
总结:
分段线性函数同样是点运算,基于像素的图像增强,也就是对比度拉伸。大概的原理就是:将不同灰度区间的灰度值经过不同的映射函数映射到另一个灰度区间的过程。

猜你喜欢

转载自blog.csdn.net/TianHW103/article/details/127840769
今日推荐