(2)计算atmospheric light

之前做了一个铺垫,拿到了一张图片的rgb中最小的值,接下来还会涉及到几行代码,其中有些语法不太懂,但是发现去百度搜索的一些博客说的不太对,还是谨慎一点,不找野路子,再看看官方文档吧。

首先是:

 darkc = min(im_min,[],3);   %得到暗通道——im_min[][]r,g,b空间中的的最小值, darkc是一个270*480*1的矩阵,代表每个点的3维的最小值

得到rgb矩阵的最小值——三维缩成了一维。还是举个例子吧——所有的人都不喜欢看文字,看例子,一眼明了:

% 创建三维数组:
d1 = [1,2,3;4,5,6;7,8,9;];
d2 = [4,5,6;7,8,9;1,2,3;];
d3 = [7,8,9;1,2,3;4,5,6;];
im_min(:,:,1) = d1;
im_min(:,:,2) = d2;
im_min(:,:,3) = d3;
im_min
im_min = min(im_min,[],3)

运行结果如下:



接下来,第二行代码

[~, idx] = sort(darkc(:),1,'descend');

首先,darkc(:):   Use A(:), the column representation of A.

darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;]  % (3 * 3)的矩阵

darkc(:) = [ 7; 1; 2; 4; 3; 6; 5; 8; 9;] % (9 * 1)的矩阵

 参数1在这里表示就是第一维度的排序。

(注: 在matlab中,一个矩阵从上到下为第一维,从左到右,为第二维。举个例子: 

darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;]  % (3 * 3)的矩阵

darkc(3)等于5而不是2, drakc(4)等于1而不是4   )

descend这么明显的参数就不用说了

那么idx是什么呢,就是index下标,直接举例子,浅显易懂:

darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;]
[SortedDarkC, idx] = sort(darkc(:),1,'descend')

运行结果是:

darkc =
     7     1     2
     4     3     6
     5     8     9
SortedDarkC =
     9
     8
     7
     6
     5
     4
     3
     2
     1
idx =
     9
     6
     1
     8
     3
     2
     5
     7
     4

idx是原来的矩阵元素对应的下标:

SortedDarkC [i] 恒等于 darkc[ idx[i] ];

那么上述语句中的 “~”又是什么鬼呢?应该就是不在乎的变量的意思吧。


再接下来,第三行代码:

sz = size(im);  % x, y , 3(rgb)
idx = idx(1:int32(0.001*sz(1)*sz(2)));

sz(1) = 270, sz(2) = 480(图片像素) , 129.6通过in32转成了130

idx只保留了前130个值,注意到我们是降序排序,所以前130个值就是值最大的像素点的坐标。

再来扎心的第四个代码:

im_gray = rgb2gray(im);         % 270 * 480 的二维矩阵
[~, idx] = max(im_gray(idx));

得先看看 im_gray(idx) 这个诡异的操作, 二维矩阵A(列向量)  是什么鬼。看个例子就能懂:

darkc = [ 7, 1, 2; 4, 3 ,6;5, 8, 9;]
index = [6;5;4;3;2;1;];
Temp = darkc(index)

输出的是:

darkc =
     7     1     2
     4     3     6
     5     8     9
Temp =
     8
     3
     1
     5
     4
     7
也就是说,二维矩阵A(列向量) 通过对应的下标,得到一个新的矩阵(在本例中是一个列向量)

再通过max取列向量中的最大值,也就是一个数字。此时idx就更新成为灰度图中灰度值最大的点在im_gray(idx)的坐标。


第4个代码:

tmp = reshape(im,[],3);

matlab的reshape函数,那么也弄一个例子看看:

d1 = [1,2,3;4,5,6;7,8,9;];
d2 = [4,5,6;7,8,9;1,2,3;];
d3 = [1,1,1;1,1,1;2,2,2;];
im(:,:,1) = d1;
im(:,:,2) = d2;
im(:,:,3) = d3;
im
tmp = reshape(im,[],3)

输出如下:

im(:,:,1) =
     1     2     3
     4     5     6
     7     8     9
im(:,:,2) =
     4     5     6
     7     8     9
     1     2     3
im(:,:,3) =
     1     1     1
     1     1     1
     2     2     2
tmp =
     1     4     1
     4     7     1
     7     1     2
     2     5     1
     5     8     1
     8     2     2
     3     6     1
     6     9     1
     9     3     2

揉成3列的数组。tmp也就是rgb图片按这个方式揉成的矩阵


最后一行代码:

A = double(tmp(idx,:));

tmp(idx,:) 是啥,那么再举一个例子,在上一个示例代码,再加一个操作:

A = tmp(3,:)

输出是:

tmp =
     1     4     1
     4     7     1
     7     1     2
     2     5     1
     5     8     1
     8     2     2
     3     6     1
     6     9     1
     9     3     2
A =
     7     1     2

根据之前得到的idx表示一个点的坐标,A就是一个点r , g, b的值!

虽然是这么得出A的值,但是我并不理解为什么A的值可以这么求呢,真奇怪,先放着。













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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值