【图像处理】畸形图像矫正(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

结合当前时代科技发展水平分析,自从计算机、网络等普及后,很多技术在研究过程中都侧重智能化、自动化应用,数字图像处理技术也是如此,该技术主要是通过扫描、识别从而掌握图像信息特征,然后基于需求可进行复原、分割等操作,该技术主要优势是可最大限度保证图像清晰度和传输效率,基于这一特点在多领域展现独特的优势,在生物医学、工业工程、航空航天等均取得显著成果,在此结合当前实际应用情况,分析数字图形处理技术的特点和功能优势所在,并对其未来发展做出些许思考,以期为该项技术实现进一步发展提供支持。生活中的畸形图像是由于针孔相机模型不考虑镜头畸变,相机的结构中存在着一些光学透镜,导致成像后的图像发生了扭曲,原本直立的高楼变得扭曲。图像畸变的原因有很多,现在只考虑由于相机本身引起的畸变。

1,镜头畸变:透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真;镜头的畸变分为径向畸变和切向畸变两类。
2,径向畸变:由透镜的形状引起的畸变称为径向畸变。即沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在普通廉价的镜头中表现更加明显。

本文将使用Matlab代码实现畸形图像的矫正!

📚2 运行结果

 

 

 部分代码:

imglinear1=imread('linear.png');%自动标记线性畸形标记
imglinear=rgb2gray(imglinear1);
hlinear=[];
k=0;
[m,n]=size(imglinear);
for i=2:m-1%遍历寻找特征点
     for j=2:n-1
         if imglinear(i,j)~=imglinear(i+1,j+1)&&imglinear(i+1,j)==imglinear(i,j+1)&&imglinear(i,j)~=imglinear(i+1,j)&&imglinear(i+1,j)~=imglinear(i+1,j+1)
             k=k+1;
             hlinear=[hlinear;[i,j]];
         end
     end
end 
figure(1);
imshow(imglinear1);
for i=1:k %特征点标记数字
    s=sprintf('%d',i);
    text(hlinear(i,1),hlinear(i,2),s);
end

imgoriginal1=imread('orignal.png');%原始图像标记特征点
imgoriginal=rgb2gray(imgoriginal1);
horiginal=[];
k=0;
[m,n]=size(imgoriginal);
for i=2:m-1
     for j=2:n-1
         if imgoriginal(i,j)~=imgoriginal(i+1,j+1)&&imgoriginal(i+1,j)==imgoriginal(i,j+1)&&imgoriginal(i,j)~=imgoriginal(i+1,j)&&imgoriginal(i+1,j)~=imgoriginal(i+1,j+1)
             k=k+1;
             horiginal=[horiginal;[i,j]];
         end
     end
end 
figure(2);
imshow(imgoriginal1);
for i=1:k
    s=sprintf('%d',i);
    text(horiginal(i,1),horiginal(i,2),s);
end

imgcubic1=imread('cubic.png');%cubic图像手工标记,导入.xlsx数据
figure(3);
imshow(imgcubic1);
[hcubic]=xlsread('cubic.xlsx') ;
for i=1:49
    s=sprintf('%d',i);
    text(hcubic(i,1),hcubic(i,2),s);
end

%以下为变换函数拟合过程
%calibration为变换函数,输入para为变换函数参数,X为原始点坐标
%由原始图片像素点计算得到变形图片对应坐标,经过双线性变换后得到对应坐标点像素值,然后还原到原始图片像素点
para0=[1,1,1,0.1,0.1,0.1,0,0,0,0];%二维三阶函数拟合参数初始化

%四行代码分别为计算三次、线性畸形x,y坐标二维三阶变换函数拟合参数
paracubicx=lsqcurvefit(@calibration, para0, horiginal, hcubic(:,1));
paracubicy=lsqcurvefit(@calibration, para0, horiginal, hcubic(:,2));
paralinearx=lsqcurvefit(@calibration, para0, horiginal, hlinear(:,1));
paralineary=lsqcurvefit(@calibration, para0, horiginal, hlinear(:,2));

piclinear=calibrate(paralinearx,paralineary,imglinear1);
figure(4);
imshow(piclinear);


piccubic=calibrate(paracubicx,paracubicy,imgcubic1);
figure(5);
imshow(piccubic);


function [ out ] = calibration( para, x )%calibration为变换函数,输入para为变换函数参数,X为原始点坐标
out = para(1)+para(2).*x(:,1)+para(3)*x(:,2)+para(4)*x(:,1).*x(:,2)+para(5).*x(:,1).*x(:,1)+para(6)*x(:,2).*x(:,2)+para(7).*x(:,1).*x(:,1).*x(:,2)...
+para(8).*x(:,1).*x(:,2).*x(:,2)+para(9).*x(:,1).*x(:,1).*x(:,1)+para(10).*x(:,2).*x(:,2).*x(:,2);
end

function [ out ] = calibrate( parax,paray, x )%calibration为变换函数,输入para为变换函数参数,x为畸形图像
out = zeros(size(x),'uint8');
[m,n,~]=size(x);
for i=1:m
    for j=1:n
        xx=round(calibration( parax, [i,j] ));
        yy=round(calibration( paray, [i,j] ));
        if i==121&&j==80
            c=1;
        end
        if xx>=1&&xx<=m&&yy<=n&&yy>=1
           out(i,j,:)=x(xx,yy,:);
        end
    end
end
end

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]欧冰,杨晶晶.数字图像处理技术现状与展望[J].中国新通信,2023,25(01):76-78.

[2]周克娟.Matlab数字图像处理与矩阵概念及运算教学的融合[J].广西广播电视大学学报,2022,33(05):27-32.

🌈4 Matlab代码实现

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值