华南理工大学数学实验图像形状及颜色畸变校正
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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