华南理工大学数学实验图像形状及颜色畸变校正

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数学实验》报告

实验六图像形状及颜色畸变的校正

一、实验目的与要求

让学生了解数字图像的数学表达及相关概念,通过实验让学生加深对数学在相关学科的应用价值的认识,培养学生的实际操作能力,并引导他们建立基础学科在处理具体问题时方法上的联系。

二、实验内容

1.任意选取一幅颜色畸变的图像,按照本实验的算法做出校正,对校正效果进行分析。

2.任意选取一幅图像模糊的图像,按照本实验的算法做出校正,对校正效果进行分析。

3.提出图像校正的其他方法,并与本实验的算法做比较分析。

三.实验过程

1.选取一幅颜色畸变的图像,按照本实验的算法做出校正。

首先,先通过观察各维度直方图的像素点的像素值在区间[0,255]上的分布情况,来了解图像颜色畸变问题出现的具体原因。为此,先编写一个显示各维度灰度直方图的程序。

具体程序如下:

function show (path)

I=imread(path);

J1=I(:,:,1);

J2=I(:,:,2);

J3=I(:,:,3);

subplot(3,1,1); %将窗口分割为三行一列,下图显示于第一行

imhist(J1); %显示灰度直方图

title('显示第一维灰度直方图'); %图释

subplot(3,1,2); %将窗口分割为三行一列,下图显示于第一行

imhist(J2); %显示灰度直方图

title('显示第二维灰度直方图'); %图释

subplot(3,1,3); %将窗口分割为三行一列,下图显示于第一行

imhist(J3); %显示灰度直方图

title('显示第三维灰度直方图'); %图释

程序截图如图1.1所示;

图 1-1. 程序截图show函数

选择一张颜色畸变的图像,在命令窗口键入:show ('1.jpg') ,然后回车运行程序,提取像素点各维度像素值在区间[0,255]上分布情况的直方图,结果如图2所示;

图 2. 像素点各维度像素值在区间[0,255]上分布情况的直方图

由图可见,主要是第三维的直方图的像素明显集中在0处到125处,而另一部分有空缺,所以通过调整该直方图的像素点的像素值在区间[0,255]上的分布来解决图像颜色畸变问题,程序算法如下:

具体程序如下:

function dealcolor(pic,k,d)

a=imread(pic); %提取指定图像到矩阵a

b=double(a); %将矩阵a的数据转化为double型

[m,n]=size(b(:,:,k)); %取图像矩阵的行列数

fr=255/d; %设定拉伸系数

for i=1:m % 二重循环对矩阵内的每一个数据进行处理for j=1:n

bm=b(i,j,k)*fr; % 拉伸处理

if bm>255 %将所有值大于255的点都设为255

bm=255;

end

b(i,j,k)=bm;

end

end

c=uint8(b); %将矩阵b转化为8个字节的整型数据

subplot(1,2,1); %将窗口分割为两行一列,下图显示于第一行

imshow(a); %显示原图像

title('颜色畸变的图像'); %图释

subplot(1,2,2); %将窗口分割为两行一列,下图显示于第二行

imshow(c); %显示处理过的图像

title('算法处理过的图像'); %图释

程序截图如图3所示:

图3.程序dealcolor函数

在命令窗口键入:dealcolor('1.jpg',3,125),然后回车,运行程序,将处理前后的图列在一起对比,运行结果如图4所示:

图4.运行结果处理前后比较

分析:观察上图可知,算法很明显的改善了图像整体的色质,对比处理前后的图像,颜色畸变的情况得到了很好的改善,处理后的图片色调明亮清晰。

2.任意选取一幅图像模糊的图像,按照本实验的算法做出校正,对校正效果进行分析。

首先,先通过观察各维度直方图的像素点的像素值在区间[0,255]上的分布情况,

来了解图像颜色畸变问题出现的具体原因。为此,先编写一个显示各维度灰度直方图的程序。

具体程序如下:

function faintness(pic,tem_n)

%pic代表处理的图片的路径,tem_n代表采用第几种模板

a=imread(pic); %导入图像,并把数据存放到三维矩阵a中

b=double(a); %将数据转化为双精度

[h,w,k]=size(b); %取矩阵的维数

g=zeros(h,w,k)+255; %生成一个与原图像矩阵有相同维数的矩阵g

for y=2:h-1 %剔除图像矩阵最外一层的点,处理可以被模板包含的点for x=2:w-1

for j=1:k

g(y,x,j)=pick_tem(b,x,y,j,tem_n); %采用二阶微分算子处理,返回处理点(x,y)后的像素值

end

end

end

subplot(1,2,1); %将窗口分割为两行一列,下图显示于第一行

imshow(a); %显示原图像

title('原先模糊的图像'); %图释

subplot(1,2,2); %将窗口分割为两行一列,下图显示于第二行

imshow(uint8(g)); %显示处理过的图像

title('算法处理过的图像'); %图释

% image(uint8(g)); %显示处理后的图像

function pic_tem = pick_tem(b,x,y,j,tem_n) % b是一个三维矩阵,j 是代表第几层矩阵

%tem_n代表模板号0代表采用第一种模板,1代表采用第二种模板

if tem_n==0 %第一种模板,并返回二阶微分处理后的值

pic_tem=5*b(y,x,j)-(b(y,x-1,j)+b(y+1,x,j)+b(y-1,x,j)+b(y,x+1,j)); else%第二种模板,并返回二阶微分处理后的值

pic_tem=9*b(y,x,j)-(b(y-1,x-1,j)+b(y-1,x,j)+b(y-1,x+1,j)+b(y,x-1, j)+b(y+1,x+1,j)+b(y+1,x-1,j)+b(y+1,x,j)+b(y+1,x+1,j));

end

相关文档
最新文档