首页 > 其他分享 >图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸

图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸

时间:2022-11-28 20:00:35浏览次数:87  
标签:cos 灰度变换 图像 ceil im1 im2 反色 sin


这次我们要处理的是对图像进行旋转操作,具体要求,如下:

       自定义一个图像的仿射变换函数,用于旋转给定的输入图像,该函数的输入参数包括处理前的图像和旋转角度。输入的角度为正数,表明处理结果为顺时针旋转,负数则为逆时针旋转,输出参数为处理后的图像。

       曾参考《数字图像处理(第三版)》一书中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),结果如下:


图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸_Matlab


旋转-45°——> myRotation('实验2_lena.bmp',-45),结果如下:

图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸_对比度拉伸_02


图像反色处理

       自定义一个函数,将输入图像进行反色处理,该函数输入参数为处理前的图像,输出参数为处理后的图像。

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中的矩阵运算编写程序,这样程序可以更加精简,这里就不给出了。   

实验2_lena.bmp'),运行结果如下:

图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸_Matlab_03

图像对比度拉伸变换

  自定义一个图像的对比度拉伸函数,将输入图像的对比度拉伸到指定的灰度级区间,该函数的输入参数包括处理前的图像、期望灰度级区间的最小值和最大值(如指定区间为[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('输出图像');


实验2_lena.bmp'),运行结果如下:

图像的灰度变换——图像旋转、图像的反色处理、对比度拉伸_Matlab_04


标签:cos,灰度变换,图像,ceil,im1,im2,反色,sin
From: https://blog.51cto.com/u_15894233/5893625

相关文章

  • 空间域滤波:图像平滑和锐化
    (1)自定义一个空间域平滑滤波函数,以达到滤除指定类型噪声(如高斯噪声和椒盐噪声等)的目的,该函数的输入参数包括滤波器类型filter_type (如高斯均值滤波、中值滤波、最大/小值......
  • 图像的频率域高斯低通滤波
    (1)自定义一个图像的频率域高斯低通滤波处理函数,要求该函数的输入参数包括处理前的图像ima和距频率矩形中心的距离D0(截止频率),输出参数为滤波处理后的图像im2。 自定义的高......
  • 基于GUI的简易图像处理系统设计与实现
    自定义简易图像处理系统:综合此前内容得出该系统,系统功能包括:图像简单处理、图像的灰度变换、图像直方图均衡化和比特平面分层、空间域滤波、频率域滤波、彩色图像的空间域滤......
  • BMP 图像文件解析及直方图均衡化算法(Java)
    BMP图像解析,基本照抄关于Java读取和编写BMP文件的总结直方图均衡化没抄着,自己写了一个。代码结构:GUI:JavaSwing实现importUtils.BMPImage;importUtils.GraphUti......
  • opengl显示16位灰度图像
    最近这几个月一直在思索一个问题,就是如何使用opengl显示16位的灰度图像。在寻找实现方法的过程中,一个主要的问题是对glsl不理解。目前对glsl有了一点初步的认识。现在的......
  • 【AI有识境】如何掌握好图像分类算法?
    大家好,这是专栏《AI有识境》的第一篇文章,讲述如何掌握好图像分类算法。进入到有识境界,可以大胆地说自己是一个非常合格的深度学习算法工程师了,能够敏锐地把握自己研究的领域......
  • 一张VR图像帧的生命周期
    “VR应用程序每帧渲染两张图像,一张用于左眼,一张用于右眼。”人们通常这样来解释VR渲染,虽然没有错,但可能过于简单化了。对于Quest开发人员来说,了解全貌是有益的,这样你......
  • BT - Unet:生物医学图像分割的自监督学习框架
    BT-Unet采用Barlowtwin方法对U-Net模型的编码器进行无监督的预训练减少冗余信息,以学习数据表示。之后,对完整网络进行微调以执行实际的分割。BT-Unet由IndianInstitute......
  • 【图像处理】小波编码图像中伪影和纹理的检测附Matlab代码和报告
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进。......
  • 【图像分割】基于神经气体网络 (NGN)实现图像分割附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进。......