在航摄领域中,对摄影像片拍摄绝大部分采用白天或者光线充足的时候,在昏暗的环境中几乎无法使用,因此,除非我们拥有一台超级昂贵的相机,否则我们几乎无法真正地获得更多像片中的信息。当然,我们可以尝试增加曝光地方法来提高亮度,但同时会把像片的白平衡放大,增大图像中的噪点。为此,我将引入卷积神经网络的概念,进行图像翻译,提出夜间航摄的新高度。
1.航摄像片(aerial photography)
航摄像片是航摄仪在空中对地面根据中心投影原理摄成的像片。
航摄像片又称“航空像片”。用航摄仪从空中向地面进行连续摄影所得的像片。按航摄仪在摄影时主光轴偏离铅垂方向的倾角,可分为垂直摄影像片和倾斜摄影像片,前者主光轴倾斜不大于3°,后者大于3°。常用的是垂直摄影像片。按拍摄时的用光波段和像片色彩可分为红外航摄像片、彩色航摄像片、黑白航摄像片以及多光谱航摄像片等。航摄像片是航空测量和航空地质等工作的基础资料,也是解决农业、林业、水利和军事等有关问题的重要资料。在地震构造、震害、新构造研究中有广泛应用,也是基础性的遥感图像之一。
2.影响航拍的因素(Factors affecting aerial photography)
通过大量的航拍试验分析,归纳总结出影响相机参数设置的主要因素。
(1)光源的强度。光源的强度是影响摄影曝光的重要因素之一。野外摄影的光源主要是自然光,而自然光的强弱又与天气阴晴、时间早晚、季节变化和地域差异有密切的联系。天气的变化一般可分为晴空万里、薄云蔽日、 阴云遮日、乌云密集,这4种天气在曝光控制上,一般为各差1级光圈或快门速度。光源的强度还伴随着时间的不同而有所差别:中午前后最大;日出后和日落前2 h为中午的1/2;日出后和日落前1 h约为中午的1/4~1/5。日出时和日落时约为中午的1/10。实际中应根据不同时间来调节曝光量。
(2)测光。在具体拍摄时,根据曝光需求来设置测光模式,期间多注意观察环境光线,并估算被摄物体的色调与环境的反差之间的关系,从而适当调整光圈和快门,来获取各种不同需求的影像。在实际作业中一般先远处后近处测光,最后根据实际选取。
因此,要获取成像清晰、层次丰富、色调柔和且色彩平衡的影像,对于不同的地物、地貌,相机设置有不同的参数。
1. 图像卷积 (Image convolution)
卷积(Convolution):卷积运算就是对于图像 f(x,y) 中的每个像素,将其作为中心像素,计算它及其邻域像素和kernel核 w(a,b)对应位置元素的乘积,然后把结果相加到一起,得到的值就作为该中心像素的新值,这样就完成了一次卷积运算。然后将kernel向下或向左平移一位继续计算每个像素的新值,直到遍历完整个图像。
卷积运算的公式如下:
还有一个概念是互相关(Cross-correlation),流程和卷积类似,区别在于卷积在运算前需要把kernel围绕中心旋转180度(即做一次上下翻转(filp)和一次左右翻转),而互相关则不需要。
互相关的公式如下:
两者的具体区别可以查看 卷积运算和相关运算的区别与物理含义。
互相关主要用于计算两个图像的相关性(主要用于图像配准)。因为我们平时接触的卷积核大都是关于x轴和y轴对称的,所以卷积和互相关在这种情况下没什么区别。
中心像素在图像的边缘时,没有足够的像素与kernel进行运算,有两个方法:
最外面的一圈像素不进行计算,如果图像非常大,丢掉图像边缘的一圈对结果影响不大。
更好的办法是人为地在图像四周插入一圈像素(比如最近邻插值)。
图像的处理结果可能超出值域范围(0-255),则小于0的值视作0,大于255的视作255就行了
2.卷积去噪(Convolution denoising)
能用卷积消除的噪声通常是高斯白噪声。 卷积的两个函数,其中一个是图像,另一个叫filter kernel,最简单的是一个均值滤波器。 卷积的过程其实就是对图像上的每个像素跟它周围的像素取平均值的过程。 以均值滤波为例,信号可以表示为g=f+n,f是实际值,n是加性高斯噪声,均值0,标准差sigma。
输入一张含噪图像(这里是40x40x1的灰度图像块,图像块大小可变),通过神经网络提取特征与原始无噪声图像进行损失函数的计算,并通过不断优化减少损失函数,从而输出去噪后的图像。最简单的就一到三层网络,这里使用9层网络进行实验。直接上网络模型:
“def get _ cnn 9conv(model_path=None):
Input _ img = Input(shape=((None, None, 1)))
adapt this if using `channels_first` image data format
x = Conv2D(56, (5, 5), activation='relu', padding='same')(input_img)
x = Conv2D(12, (1, 1), activation='relu', padding='same')(x)
x = Conv2D(12, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(12, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(12, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(12, (3, 3), activation='relu', padding='same')(x)
x = Conv2D(56, (1, 1), activation='relu', padding='same')(x)
x = Conv2D(28, (9, 9), activation='relu', padding='same')(x)
decoded = Conv2D(1, (5, 5), activation='relu', padding='same')(x)”
训练集使用的是200张图像,对数据集进行扩充,得到23万张40x40大小的图像块。测试集使用的是Set12,加入的是标准差为25的加性高斯白噪声(AWGN),客观评价标准使用的是峰值信噪比(PSNR),效果比简单3层网络要好很多。
3.边缘提取(edge extraction)
图像梯度用于边缘检测。边缘是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、目标检测等方面都有重要的作用。
图像中有灰度值的变化就会有梯度,从而产生边缘,在边缘处,具有变化的强弱及方向。这时一些常见的图像识别算法的基础,比如 hog,sift,都是基于梯度的。
边缘分为三类,step edge、ramp edge和peak edge,下面是三类边缘的及其导数(一阶或者二阶)的形状:
根据不同的图像边缘特征,来决定是使用一阶还是二阶导数来求梯度。对图像求一阶或者高阶导数,会得到一些峰值,当这些峰值超过指定阈值时,则认为这些峰值对应的像素是边缘。
前面说到在图像上可以使用一阶差分来计算相邻像素之间的变化率,我们利用卷积和特定的算子来计算相邻像素的变化率。prewitt算子和sobel算子可以计算相邻三个点之间的变化率。它们用于一阶算子的边缘检测,利用像素点上下、左右相邻点的灰度差求取边缘。
(如图为吉林省地图边缘提取效果)
4.影像处理(image processing)
局部代码:
img_org = imread('timg.png');
figure(1);
imshow(img_org);
title('原图像');
//加噪声
sigma = 25;
img_noise = double(img_org)+sigma * randn(size(img_org));
figure;
imshow(img_noise / 255, []);
title('噪声图像');
img_denoise = BM3D_Color(img_noise, 0, sigma, 0, 1);
figure;
imshow(img_denoise / 255, []);
title('去噪图像');
img_org = imread('timg.png');
img_gray = rgb2gray(img_org);
figure(1);
imshow(img_gray);
title('原图像');
//加噪声
sigma = 25;
img_noise = double(img_gray)+sigma * randn(size(img_gray));
figure;
imshow(img_noise / 255, []);
title('噪声图像');
img_denoise = BM3D_Gray(img_noise, 0, sigma, 1);
figure;
imshow(img_denoise / 255, []);
title('去噪图像');
function [block,transform_block,block2row_idx,block2col_idx] =im2block(img,k,p,lambda2D,delta)
实现图像分块
Inputs:
k: //块大小
p: //块移动步长
lambda_2D: //收缩阈值
delta: //收缩阈值
Outputs:
block: //返回的块
transform_block: //变换后的块
block2row_idx: //块索引与图像块的左上角行坐标对应关系
block2col_idx: //块索引与图像块的左上角列坐标对应关系
[row,col] = size(img);
/*频域去噪中的硬阈值*/
thres = lambda2D*delta*sqrt(2*log(row*col));
r_num 和 c_num//可以采集的块的数目
r_num = floor((row-k)/p)+1;
c_num = floor((col-k)/p)+1;
block = zeros(k,k,r_num*c_num);
block2row_idx = [];
block2col_idx = [];
cnt = 1;
for i = 0:r_num-1
rs = 1+i*p;
for j = 0:c_num-1
cs = 1+j*p;
block(:,:,cnt) = img(rs:rs+k-1,cs:cs+k-1);
block2row_idx(cnt) = rs;
block2col_idx(cnt) = cs;
tr_b = fft2(block(:,:,cnt));
idx = find(abs(tr_b)<thres);
tr_b(idx) = 0;
transform_block(:,:,cnt) = tr_b;
cnt = cnt+1;
end
end
end
function [blk_est]=inv_transform_3d(blk_tran3d,tran_mode)
Inputs:
blk_tran3d: //在频域中,硬阈值滤波的图像块
tran_mode: //变换方法
Outputs:
blk_est:
global blk_tran1d_s;
global blk_2d_s;
[m,n,blk_num]=size(blk_tran3d);
blk_invtran1d=zeros(m,n,blk_num);
blk_est=zeros(m,n,blk_num);
if(tran_mode==0)
fft
for i=1:1:m
for j=1:1:n
blk_invtran1d(i,j,:)=ifft(blk_tran3d(i,j,:));
end
end
for i=1:1:blk_num
blk_est(:,:,i)=ifft2(blk_invtran1d(:,:,i));
end
elseif(tran_mode==1)
dct
for i=1:1:m
for j=1:1:n
blk_invtran1d(i,j,:)=idct(blk_tran3d(i,j,:));
end
end
for i=1:1:blk_num
blk_est(:,:,i)=idct2(blk_invtran1d(:,:,i));
end
elseif(tran_mode==2)
dwt
blk_num=length(blk_2d_s);
blk_c=waverec2(blk_tran3d,blk_tran1d_s,'haar');
blk_est=[];
for i=1:1:blk_num
blk_est(:,:,i)=waverec2(blk_c(:,i),blk_2d_s{i},'Bior1.5');
end
else
error('tran_mode error');
end
end
function img_trans = other2rgb(img_in, color_mode)
//将RGB颜色空间转为其他颜色空间
Inputs:
img_in: RGB//颜色空间图像
color_mode: //彩色图像去噪时采用的颜色空间, 默认值为0
color_mode: = 0, YUV; = 1, YCbCr; = 2, OPP
Outputs:
img_trans: //其他颜色空间
Author: HSW
Date: 2018-05-06
img_trans = zeros(size(img_in));
[row, col, dims] = size(img_in);
if color_mode == 0
color_tran = [0.30, 0.59, 0.11; -0.15, -0.29, 0.44; 0.61, -0.51, -0.10];
color_tran_inv = inv(color_tran);
for i = 1:row
for j = 1:col
other = [img_in(i, j, 1); img_in(i, j, 2); img_in(i, j, 3)];
img_trans(i, j, :) = color_tran_inv * other;
end
end
elseif color_mode == 1
color_tran = [0.30, 0.59, 0.11; -0.17, -0.33, 0.50; 0.50, -0.42, -0.08];
color_tran_inv = inv(color_tran);
for i = 1:row
for j = 1:col
other = [img_in(i, j, 1); img_in(i, j, 2); img_in(i, j, 3)];
img_trans(i, j, :) = color_tran_inv * other;
end
end
elseif color_mode == 2
color_tran = [1.0 / 3.0, 1.0 / 3.0, 1.0 / 3.0; 1.0 / 2.0, 0, -1.0 / 2.0; 1.0 / 4.0, -1.0 / 2.0, 1.0 / 4.0];
color_tran_inv = inv(color_tran);
for i = 1:row
for j = 1:col
other = [img_in(i, j, 1); img_in(i, j, 2); img_in(i, j, 3)];
img_trans(i, j, :) = color_tran_inv * other;
end
end
end
end
——灰度化。去高斯白噪声并完成边缘提取后:
对航摄像片的处理,结合了图像卷积和高斯白噪音,在试想情况下达到了夜间或昏暗条件下也可进行航摄及摄影测量的成果。