光照亮度调整(图像拼接之前)

理论部分来自《全景图像拼接关键技术研究》,这里讲了一个全局调整光照亮度的办法,很简单易懂:

%AA、BB是两幅原图 左 右
%A、B是重叠区域对应在两幅图的位置 A is the left and B is the right.
%转换了颜色空间
%下面是根据《全景图像拼接关键技术研究》中的亮度调整办法
AA=imread('F:\fisheye\others1.jpg');
BB=imread('F:\fisheye\others2.jpg');
[H,W,k]=size(AA);
rdata1=-76;
L=W+1+rdata1;
R=W;
n=R-L+1;
for i=1:H
    for j=L:R
        jj=j-L+1;
        A(i,jj,1)=AA(i,j,1);
        A(i,jj,2)=AA(i,j,2);
        A(i,jj,3)=AA(i,j,3);
        B(i,jj,1)=BB(i,jj,1);
        B(i,jj,2)=BB(i,jj,2);
        B(i,jj,3)=BB(i,jj,3);
    end
end
A=uint8(A);
B=uint8(B);
%上面是根据之前H矩阵找到的两幅图的重叠部分A、B
[mb,nb,kb]=size(B);
I2=zeros(mb,nb);
v2=0;
for i=1:mb
    for j=1:nb
        I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
        v2=v2+I2(i,j);
    end
end
[ma,na,ka]=size(A);
I1=zeros(ma,na);
v1=0;
for i=1:ma
    for j=1:na
        I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);
        v1=v1+I1(i,j);
    end
end
k=v1/v2;
[m,n,kk]=size(BB);
for i=1:m
    for j=1:n
        BB(i,j,1)=k*BB(i,j,1);
        BB(i,j,2)=k*BB(i,j,2);
        BB(i,j,3)=k*BB(i,j,3);
    end
end

结果:

前两幅是原图 曝光差异大  后面这幅是对第二幅图调整亮度的结果图     这样就行了  效果还不错!

即:

Mat rejust_light(Mat waittoberejustimg, Mat destinateimg){
	Mat waittoberejustgrayimg(waittoberejustimg.size(), CV_8UC1, Scalar(0));
	cvtColor(waittoberejustimg, waittoberejustgrayimg, CV_RGB2GRAY);
	Mat destinategrayimg(destinateimg.size(), CV_8UC1, Scalar(0));
	cvtColor(destinateimg, destinategrayimg, CV_BGR2GRAY);
	int waitimgsum = 0, destinateimgsum = 0;
	for (int i = 0; i < waittoberejustgrayimg.rows;i++)
	{
		uchar* data = waittoberejustgrayimg.ptr<uchar>(i);
		for (int j = 0; j < waittoberejustgrayimg.cols;j++)
		{
			waitimgsum += (int)data[j];
		}
	}
	for (int i = 0; i < destinategrayimg.rows; i++)
	{
		uchar* data = destinategrayimg.ptr<uchar>(i);
		for (int j = 0; j < destinategrayimg.cols; j++)
		{
			destinateimgsum += (int)data[j];
		}
	}
	float ratio = (float)destinateimgsum / waitimgsum;
	for (int i = 0; i < waittoberejustimg.rows; i++)
	{
		for (int j = 0; j < waittoberejustimg.cols * 3; j++)
		{
			waittoberejustimg.ptr<uchar>(i)[j] = ratio*waittoberejustimg.ptr<uchar>(i)[j];
		}
	}
	return waittoberejustimg;
}










下面这个探索是错的!

前几天智商降低了.....好几天没有看书.......今天正常些了........虽然之前写的多分辨率融合也能处理光照问题调整亮度,但还是想编一个专程处理亮度不一致的程序........理论部分来自《一种光照鲁棒的图像拼接融合算法》和《基于自适应梯度域融合的图像无缝镶嵌方法》,这上面写的主要分三个步骤,就都在MATLAB上做好了:

function C=mylight(A,B)
%《一种光照鲁棒的图像拼接融合算法》中的基于方差的全局亮度调整
%A、B是重叠区域对应在两幅图的位置 A is the left and B is the right.
%转换了颜色空间
[mb,nb,kb]=size(B);
C=B;
I2=zeros(mb,nb);
for i=1:mb
    for j=1:nb
        I2(i,j)=0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3);
    end
end
m2=mean2(I2);
for i=1:mb
    for j=1:nb
        B(i,j)=B(i,j)-m2;
    end
end
fang2=0;
for i=1:mb
    for j=1:nb
        fang2=fang2+(I2(i,j)-m2)^2;
    end
end
fang2=fang2/(mb*nb);
[ma,na,ka]=size(A);
I1=zeros(ma,na);
for i=1:ma
    for j=1:na
        I1(i,j)=0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3);
    end
end
m1=mean2(I1);
fang1=0;
for i=1:ma
    for j=1:na
        fang1=fang1+(I1(i,j)-m1)^2;
    end
end
fang1=fang1/(ma*na);
for i=1:mb
    for j=1:nb
        B(i,j)=(fang1/fang2)*B(i,j)+m1;
    end
end
for i=1:mb
    for j=1:nb
        C(i,j,1)=C(i,j,1)+B(i,j)-m2;
        C(i,j,2)=C(i,j,2)+B(i,j)-m2;
        C(i,j,3)=C(i,j,3)+B(i,j)-m2;
    end
end

结果:第三幅是效果图  额  不对!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

元气少女缘结神

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

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

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

打赏作者

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

抵扣说明:

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

余额充值