图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸
2015-10-22 14:48
681 查看
这次我们要处理的是对图像进行旋转操作,具体要求,如下:
自定义一个图像的仿射变换函数,用于旋转给定的输入图像,该函数的输入参数包括处理前的图像和旋转角度。输入的角度为正数,表明处理结果为顺时针旋转,负数则为逆时针旋转,输出参数为处理后的图像。
曾参考《数字图像处理(第三版)》一书中P51的公式编写过自己的图像“旋转”函数,但是在某些角度下,输出结果却发生了错误,至于原因,也由于时间关系,仍未思考出来。使用Matlab编程,原代码如下:
另外,采用了一种方法(参考
点击打开链接),同样使用推导出来的公式,采用反向映射的方法,结合双线性内插,得出旋转后的图像。但是得出来的结果,如输入 180°,没有出现输出结果。参考后修改的程序如下:
而正确程序代码,则是通过研究参考 图像旋转算法原理(点击打开链接),在只有原理的情况下,研究透,将其转化为 程序。MATLAB代码如下:
旋转45°——> myRotation('实验2_lena.bmp',45),结果如下:
旋转-45°——> myRotation('实验2_lena.bmp',-45),结果如下:
图像的反色处理
自定义一个函数,将输入图像进行反色处理,该函数输入参数为处理前的图像,输出参数为处理后的图像。
Matlab编程,代码如下:
myFase('实验2_lena.bmp'),运行结果如下:
图像的对比度拉伸变换
自定义一个图像的对比度拉伸函数,将输入图像的对比度拉伸到指定的灰度级区间,该函数的输入参数包括处理前的图像、期望灰度级区间的最小值和最大值(如指定区间为[50 200]),输出参数为处理后的图像。
Matlab代码如下:
myContrConver('实验2_lena.bmp'),运行结果如下:
自定义一个图像的仿射变换函数,用于旋转给定的输入图像,该函数的输入参数包括处理前的图像和旋转角度。输入的角度为正数,表明处理结果为顺时针旋转,负数则为逆时针旋转,输出参数为处理后的图像。
曾参考《数字图像处理(第三版)》一书中P51的公式编写过自己的图像“旋转”函数,但是在某些角度下,输出结果却发生了错误,至于原因,也由于时间关系,仍未思考出来。使用Matlab编程,原代码如下:
%自己写的函数 function []=myRotation(pho,angle) im1=imread(pho); subplot(121); imshow(im1); title('输入图像'); im1=double(im1); [r,c,h]=size(im1); R=angle*pi/180; h2 = ceil(r*cos(R)+c*sin(R)); w2 = ceil(r*sin(R)+c*cos(R)); im2=zeros(h2,w2,h); T=[sin(R) cos(R); cos(R) -sin(R)]; %invT=inv(T); for i=1:h for x=1:h2 for y=1:w2 temp=([x y]-[0 r*sin(R)])/T; temp(1)=ceil(temp(1)); temp(2)=ceil(temp(2)); if temp(2)>0 && temp(2)<=r && temp(1)>0 && temp(1)<=c im2(x,y,i)=im1(temp(2),temp(1),i); end end end end subplot(122); imshow(uint8(im2)); title('输出图像');
另外,采用了一种方法(参考
点击打开链接),同样使用推导出来的公式,采用反向映射的方法,结合双线性内插,得出旋转后的图像。但是得出来的结果,如输入 180°,没有出现输出结果。参考后修改的程序如下:
function []=myRotation3(pho,angle) im1=imread(pho); im1=double(im1); [m,n,h]=size(im1); R = angle*pi/180; %旋转角度 %新图像大小 m2 = ceil(m*cos(R)+n*sin(R)); n2 = ceil(m*sin(R)+n*cos(R)); u0= m*sin(R);%平移量 %变换矩阵 T=[cos(R),sin(R);-sin(R),cos(R)]; L = zeros(m2,n2); for i=1:h for u=1:n2 for v=1:m2 %新图像坐标变换到原图像坐标x和y中 temp = T*([u;v]-[u0;0]); x= temp(1); y= temp(2); if x>=1 & x<=m & y>=1 & y<=n %若变换出的x和y在原图像范围内 x_low=floor(x); x_up=ceil(x); y_low=floor(y); y_up=ceil(y); %双线性内插值 p1=im1(x_low,y_low,i); p2=im1(x_up,y_low,i); p3=im1(x_low,y_low,i); p4=im1(x_up,y_up,i); s=x-x_low; t=y-y_low; L(u,v,i)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4; end end end end imshow(uint8(L)); title('输出图像');
而正确程序代码,则是通过研究参考 图像旋转算法原理(点击打开链接),在只有原理的情况下,研究透,将其转化为 程序。MATLAB代码如下:
%这个旋转才没有bug function []=myRotation(pho,angle) im1=imread(pho); subplot(121); imshow(im1); title('输入图像'); im1=double(im1); [r,c,h]=size(im1); %将角度单位化为弧度单位 R=-angle*pi/180; %这样的宽高会出现BUG,原因不明 %h2 = ceil(r*cos(R)+c*sin(R)); %w2 = ceil(r*sin(R)+c*cos(R)); %将对角线作为旋转后图像的宽高 h2=ceil(sqrt(r*r+c*c)); w2=h2; im2=zeros(h2,w2,h); %旋转时x y的偏移量 dx=-0.5*w2*cos(R)-0.5*h2*sin(R)+0.5*c; dy=0.5*w2*sin(R)-0.5*h2*cos(R)+0.5*r; %采用反向映射 for i=1:h for x=1:h2 for y=1:w2 %由结果图像的坐标 得出 原来图像的坐标 x0=ceil(x*cos(R)+y*sin(R)+dx); y0=ceil(-x*sin(R)+y*cos(R)+dy); if x0>0 && x0<=r && y0>0 && y0<=c im2(x,y,i)=im1(x0,y0,i); end end end end %显示图像 subplot(122); imshow(uint8(im2)); title('输出图像');
旋转45°——> myRotation('实验2_lena.bmp',45),结果如下:
旋转-45°——> myRotation('实验2_lena.bmp',-45),结果如下:
图像的反色处理
自定义一个函数,将输入图像进行反色处理,该函数输入参数为处理前的图像,输出参数为处理后的图像。
Matlab编程,代码如下:
function []=myFanse(pho) im1 = imread(pho); subplot(121); imshow(im1); title('输入图像'); im1 = double(im1); [r c m] = size(im1); im2 = zeros(r,c,m); for i=1:m for j=1:r for k=1:c im2(j,k,i)=255-im1(j,k,i); %由最高灰度级减去原坐标位置的灰度级进行反色 end end end im2 = uint8(im2); subplot(122); imshow(im2); title('输出图像');当然,其实也可以利用Matlab中的矩阵运算编写程序,这样程序可以更加精简,这里就不给出了。
myFase('实验2_lena.bmp'),运行结果如下:
图像的对比度拉伸变换
自定义一个图像的对比度拉伸函数,将输入图像的对比度拉伸到指定的灰度级区间,该函数的输入参数包括处理前的图像、期望灰度级区间的最小值和最大值(如指定区间为[50 200]),输出参数为处理后的图像。
Matlab代码如下:
function []=myContrConver(pho, mi, ma) im1 = imread(pho); subplot(121); imshow(im1); title('输入图像'); im1 = double(im1); [r c m] = size(im1); im2 = zeros(r,c,m); %for i=1:m % for j=1:r % for k=1:c % im2(j,k,i)=min+(im1(j,k,i)-minR)/(maxR-minR)*(max-min); % end % end %end %先对原图像的 灰度级 进行归一化,再由归一化的区间缩放至所需区间 tempIma1=im1(:,:,1); tempIma2=im1(:,:,2); tempIma3=im1(:,:,3); im2(:,:,1)=mi+(im1(:,:,1)-min(tempIma1(:)))/(max(tempIma1(:))-min(tempIma1(:)))*(ma-mi); im2(:,:,2)=mi+(im1(:,:,2)-min(tempIma2(:)))/(max(tempIma2(:))-min(tempIma2(:)))*(ma-mi); im2(:,:,3)=mi+(im1(:,:,3)-min(tempIma3(:)))/(max(tempIma3(:))-min(tempIma3(:)))*(ma-mi); im2=uint8(im2); subplot(122); imshow(im2); title('输出图像');
myContrConver('实验2_lena.bmp'),运行结果如下:
相关文章推荐
- iOS8 自定义UITabBar (使用popToViewController导致的UITabBarButton重叠的问题)
- Linux rpm 命令参数使用详解[介绍和应用]
- 【bzoj3721】 PA2014Final Bazarek 贪心
- Fragment替换工具类
- freeseal修改屏幕锁和永不修眠
- 《第一行代码Android》学习日记
- web.xml配置跨域
- dlutoj(自己家的OJ的一些不错的题)
- Orcale 和 MySql的区别 五十点
- ERROR ITMS-90049错误解决
- 安装npm
- android4.4.2内核移植3.4.1
- mongodb之查看状态的命令详解
- Android-----自定义圆形的头像控件
- poj 1655 Balancing Act 寻找树的重心
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- 【制作镜像】virsh
- Git学习 -- 工作区和暂存区
- 不会走索引的情况
- 不多花一分钱利用VMwareworkstation和nat123建立自己的小型远程服务网站