二元回归解决图像恢复问题(图像去噪)
来源:互联网 发布:守望先锋英雄数据库 编辑:程序博客网 时间:2024/06/02 05:31
1 概述
对于本次实验,进行了多次方法的更新迭代,最终使用多变量固定窗口二元高斯回归方法,自我测试效果达到:0.8噪音比下,原受损图像距离774.9727,处理后距离33.2362;0.6噪音比下,原受损图像距离671.1107,处理后距离20.1649;与一元线性回归相比提升三分之一以上。效果良好。
Figure 0
从过程来说,依次进行了如下尝试与测试:
按行一元高斯线性回归
整幅图片二元高斯线性回归
增加Phi数量进行整幅图片二元高斯线性回归
将图片均分为10 x10 按区域进行二元高斯线性回归
将图片均分为100x 100 按区域进行二元高斯线性回归
将图片均分为100x 100 按区域进行二元高斯线性回归 利用双边滤波器平滑处理
将图片均分为100x 100 按区域进行二元高斯线性回归 增加sigma维度
将图片分为固定大小5x5区域按区域进行二元高斯线性回归 增加sigma维度
将图片分为固定大小5x5区域按区进行二元高斯线性回归 加sigma维度 并行化
效果如Figure 0 所示。
接下来将依次介绍详细过程及测试效果。
2 算法依次介绍
2.1 按行一元高斯线性回归
这是助教提供的算法。思路是对每一行,根据非噪音进行回归分析,算出权重,然后计算出信息丢失点。其中,根据该点通道值是否为零判断是否是信息丢失点。Phi函数为高斯函数,sigma为0.01,Phi函数数量为50.
Figure 1为测试原图。640x640
在0.6的噪音比下,受损图片与原图的距离为671.1107。在利用按行线性回归后,效果如Figure 3,距离为31.9975。
Figure 1 测试原图
Figure 2 0.6噪音比图
Figure 3
在0.8的噪音比下,图片如Figure 4,距离达到774.9727。利用一元线性回归处理后,效果如Figure 5,距离达到54.2619.
Figure 4
Figure 5
2.2 整幅图片二元高斯线性回归
直接对整幅图片,以行、列为二维变量,其他不变进行二元高斯线性回归。高斯函数参数与按行一元相似。在0.6噪音比下,效果如Figure 6,距离变化为671.1107 - 201.1378。在0.8噪音比下,效果如Figure 7,距离变化为774.9727 - 231.9823。
效果非常差。我认为是在整幅图像下,像素点之间的相关性较弱,难以根据50个参数建立起回归函数。即使将参数扩展到1000时,效果也并未发生较大变化。0.6噪音比下,距离变化为671.1107 - 201.1402;0.8噪音比下,距离变化为774.9727 - 231.9911.
Figure 6
Figure 7
代码:
basisNum = 50; % define the number of basis functions.
sigma = 0.01; % define the standard deviation.
Phi_mu_x = linspace(1, cols, basisNum)/cols; % set the mean x value of each basis function
Phi_mu_y = linspace(1, rows, basisNum)/rows; % set the mean y value of each basis function
Phi_mu = [Phi_mu_x(:) Phi_mu_y(:)];
Phi_sigma = sigma * ones(2, basisNum); % here we set the standard deviation to the same value for brevity.
% use pixel index as the independent variable in the regression function
x = 1:cols;
x = (x - min(x)) / (max(x)-min(x));
y = 1:rows;
y = (y - min(y)) / (max(y)-min(y));
[X, Y] = meshgrid(x, y);
r = [X(:) Y(:)];
% select the missing pixels randomly
resImg = corrImg;
% for each channel
for k = 1:channels
% select the missing pixels
msk = noiseMask(:, :, k);
msk = msk(:,:);
misId = find(msk<1);
misNum = length(misId);
ddId = find(msk>=1);
ddNum = length(ddId);
% compute the coefficients
Phi = [ones(ddNum, 1) zeros(ddNum, basisNum-1)];
for j = 2: basisNum
Phi(:, j) = mvnpdf( r(ddId',:), Phi_mu(j-1), Phi_sigma(:,j-1)') * sqrt(2*pi) * Phi_sigma(j-1);
end
corrImg_channal = corrImg(:,:,k);
w = pinv(Phi' * Phi) * Phi' * corrImg_channal(ddId);
% restore the missing values
Phi1 = [ones(misNum, 1) zeros(misNum, basisNum-1)];
for j = 2: basisNum
Phi1(:, j) = mvnpdf( r(misId,:), Phi_mu(j-1), Phi_sigma(:,j-1)') * sqrt(2*pi) * Phi_sigma(j-1);
end
resImg_channal = resImg(:,:,k);
resImg_channal(misId) = w' * Phi1';
resImg(:,:,k) = resImg_channal;
end
resImg = min(resImg, 1);
resImg = max(resImg, 0);
2.3 将图片均分为10 x 10 按区域进行二元高斯线性回归
很自然的想到,将整幅图片划分为几个部分,在每个部分内进行二元高斯线性回归。实验发现,果然要比整幅图进行回归效果好很多。在0.6噪音比下,距离变化为671.1107 - 67.6776;在0.8噪音比下,距离变化为774.9727 - 78.4643。效果如Figure 8, 9所示
Figure 8
Figure 9
Code:
%% ==================learn the coefficents in row and coloumn linear regression function area by area=================
% In this section, we use gaussian kernels as the basis functions. And we
% do regression analysis row and colomun at a time.
% but we first divde the image into some square areas
smooth = false; % if smooth
areaNum = [100, 100];
basisNum = 50; % define the number of basis functions.
sigma = 10; % define the standard deviation.
Phi_mu_x = linspace(1, cols, basisNum)/cols; % set the mean x value of each basis function
Phi_mu_y = linspace(1, rows, basisNum)/rows; % set the mean y value of each basis function
Phi_mu = [Phi_mu_x(:) Phi_mu_y(:)];
Phi_sigma = sigma * ones(2, basisNum); % here we set the standard deviation to the same value for brevity.
% use pixel index as the independent variable in the regression function
x = 1:cols;
x = (x - min(x)) / (max(x)-min(x));
y = 1:rows;
y = (y - min(y)) / (max(y)-min(y));
[X, Y] = meshgrid(x, y);
r = [X(:) Y(:)];
% select the missing pixels randomly
resImg = corrImg;
% divide into areas
delta = floor([rows, cols] ./ areaNum);
areaBound_x = [1:delta(1):rows rows];
areaBound_y = [1:delta(2):cols cols];
% for each channel
for k = 1:channels
for m = 1:length(areaBound_x)-1% row of area
for n = 1:length(areaBound_y)-1% column of area
% select the missing pixels in this area
msk = noiseMask(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
msk = msk(:,:);
misId = find(msk<1);
misNum = length(misId);
ddId = find(msk>=1);
ddNum = length(ddId);
% compute the coefficients
Phi = [ones(ddNum, 1) zeros(ddNum, basisNum-1)];
for j = 2: basisNum
Phi(:, j) = mvnpdf( r(ddId',:), Phi_mu(j-1), Phi_sigma(:,j-1)');
end
corrImg_sub = corrImg(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
w = pinv(Phi' * Phi) * Phi' * corrImg_sub(ddId);
% restore the missing values
Phi1 = [ones(misNum, 1) zeros(misNum, basisNum-1)];
for j = 2: basisNum
Phi1(:, j) = mvnpdf( r(misId,:), Phi_mu(j-1), Phi_sigma(:,j-1)');
end
resImg_sub = resImg(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
resImg_sub(misId) = w' * Phi1';
resImg(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k) = resImg_sub;
end
end
end
resImg = min(resImg, 1);
resImg = max(resImg, 0);
2.4 将图片均分为100 x 100 按区域进行二元高斯线性回归
可以看到由于分块过大,图片割裂感明显,将之改为100x100,效果显著提升。
0.6噪音比下,671.1107 - 20.1649;0.8噪音比下,774.9727 - 74.5682。效果如Figure 10,11.
Figure 10
Figure 11
2.5 将图片均分为100 x 100 按区域进行二元高斯线性回归并利用双边滤波器进行平滑处理
由于分块计算,图片看起来不够圆滑,于是选择滤波器进行平滑处理。比较理想的带有去噪功能的滤波器为高斯滤波器与双边滤波器。鉴于双边滤波器不仅能去噪和平滑,而且能不影响原图边界,因而选择了高斯滤波器。但高斯滤波器在实验过程中,虽然在图片观感上更为流畅和自然,但在大部分情况下距离上升。在少部分情况下,距离下降。经过分析发现,对回归后仍有噪点的图像进行滤波,效果会提升,其他反而会下降。
在0.6与0.8下的效果如Figure12 13
Figure 12
Figure 13
2.6 将图片均分为100 x 100 按区域进行二元高斯线性回归增加sigma维度
在0.8噪音比下不断测试,思考认为,增大sigma会加强其对高噪音下的效果表现。但是较大的sigma会降低低噪音比环境下的效果。因而想增加sigma的维度,增加Phi函数,利用最大似然估计算出最适合的sigma。
因而在原先的基础上,增加了sigma的维度。
以[100 1 0.01]为sigma参数进行实验,实验结果为0.6噪音比下,671.1107 - 20.1649;0.8噪音比下,774.9727 - 29.441。效果如Figure14 15
Figure 14
Figure 15
Code:
smooth = false; % if smooth
delta = [5 5];
sub_basisNum = 50; % define the number of basis functions of each sigma
sigma = [100 1 0.01]; % define the standard deviation.
basisNum = sub_basisNum * length(sigma);
Phi_mu_x = linspace(1, cols, sub_basisNum)/cols; % set the mean x value of each basis function
Phi_mu_y = linspace(1, rows, sub_basisNum)/rows; % set the mean y value of each basis function
Phi_mu = [];
Phi_sigma = [];
for i=1:length(sigma)
Phi_mu_new = [Phi_mu;Phi_mu_x(:) Phi_mu_y(:)];
Phi_sigma_new = [Phi_sigma sigma(i) * ones(2, basisNum)]; % here we set the standard deviation to the same value for brevity.
Phi_mu = Phi_mu_new;
Phi_sigma = Phi_sigma_new;
end
% use pixel index as the independent variable in the regression function
x = 1:cols;
x = (x - min(x)) / (max(x)-min(x));
y = 1:rows;
y = (y - min(y)) / (max(y)-min(y));
[X, Y] = meshgrid(x, y);
r = [X(:) Y(:)];
% select the missing pixels randomly
resImg = corrImg;
% divide into areas
areaBound_x = [1:delta(1):rows rows];
areaBound_y = [1:delta(2):cols cols];
% for each channel
for k = 1:channels
for m = 1:length(areaBound_x)-1% row of area
for n = 1:length(areaBound_y)-1% column of area
% select the missing pixels in this area
msk = noiseMask(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
msk = msk(:,:);
misId = find(msk<1);
misNum = length(misId);
ddId = find(msk>=1);
ddNum = length(ddId);
% compute the coefficients
Phi = [ones(ddNum, 1) zeros(ddNum, basisNum-1)];
for j = 2: basisNum
Phi(:, j) = mvnpdf( r(ddId',:), Phi_mu(j-1), Phi_sigma(:,j-1)');
end
corrImg_sub = corrImg(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
w = pinv(Phi' * Phi) * Phi' * corrImg_sub(ddId);
% restore the missing values
Phi1 = [ones(misNum, 1) zeros(misNum, basisNum-1)];
for j = 2: basisNum
Phi1(:, j) = mvnpdf( r(misId,:), Phi_mu(j-1), Phi_sigma(:,j-1)');
end
resImg_sub = resImg(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
resImg_sub(misId) = w' * Phi1';
resImg(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k) = resImg_sub;
end
end
end
resImg = min(resImg, 1);
resImg = max(resImg, 0);
%smooth
if smooth
smooth_d = 6;
smooth_sigma = [3 0.1];
resImg = BilateralFilt2(double(resImg), smooth_d, smooth_sigma);
end
2.7 将图片分为固定大小5x5区域 按区域进行二元高斯线性回归增加sigma维度
但将图片均分并不是合理的做法,回归效果应和具体窗口大小有关,如果对于不同大小图片进行相同份数均分,其效果实际并不相同。所以讲原先均分的区域划分法改成固定窗口大小的区域划分法。效果变化不大,但对于各种分辨率的图片效果更为稳定。
最后,为加快速度,进行了并行化。
smooth = false; % if smooth
delta = [5 5];
sub_basisNum = 50; % define the number of basis functions of each sigma
sigma = [100 1 0.01]; % define the standard deviation.
basisNum = sub_basisNum * length(sigma);
Phi_mu_x = linspace(1, cols, sub_basisNum)/cols; % set the mean x value of each basis function
Phi_mu_y = linspace(1, rows, sub_basisNum)/rows; % set the mean y value of each basis function
Phi_mu = [];
Phi_sigma = [];
for i=1:length(sigma)
Phi_mu_new = [Phi_mu;Phi_mu_x(:) Phi_mu_y(:)];
Phi_sigma_new = [Phi_sigma sigma(i) * ones(2, basisNum)]; % here we set the standard deviation to the same value for brevity.
Phi_mu = Phi_mu_new;
Phi_sigma = Phi_sigma_new;
end
% use pixel index as the independent variable in the regression function
x = 1:cols;
x = (x - min(x)) / (max(x)-min(x));
y = 1:rows;
y = (y - min(y)) / (max(y)-min(y));
[X, Y] = meshgrid(x, y);
r = [X(:) Y(:)];
% select the missing pixels randomly
resImg = corrImg;
% divide into areas
areaBound_x = [1:delta(1):rows rows];
areaBound_y = [1:delta(2):cols cols];
parpool('local', 2);
% for each channel
parfor k = 1:channels
for m = 1:length(areaBound_x)-1% row of area
for n = 1:length(areaBound_y)-1% column of area
% select the missing pixels in this area
msk = noiseMask(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
msk = msk(:,:);
misId = find(msk<1);
misNum = length(misId);
ddId = find(msk>=1);
ddNum = length(ddId);
% compute the coefficients
Phi = [ones(ddNum, 1) zeros(ddNum, basisNum-1)];
for j = 2: basisNum
Phi(:, j) = mvnpdf( r(ddId',:), Phi_mu(j-1), Phi_sigma(:,j-1)');
end
corrImg_sub = corrImg(areaBound_x(m):areaBound_x(m+1), areaBound_y(n):areaBound_y(n+1), k);
w = pinv(Phi' * Phi) * Phi' * corrImg_sub(ddId);
% restore the missing values
Phi1 = [ones(misNum, 1) zeros(misNum, basisNum-1)];
for j = 2: basisNum
Phi1(:, j) = mvnpdf( r(misId,:), Phi_mu(j-1), Phi_sigma(:,j-1)');
end
x0 = areaBound_x(m);
x1 = areaBound_x(m+1);
y0 = areaBound_y(n);
y1 = areaBound_y(n+1);
resImg_sub = resImg(x0:x1, y0:y1, k);
resImg_sub(misId) = w' * Phi1';
resImg(x0:x1, y0:y1, k) = resImg_sub;
end
end
end
parpool close;
resImg = min(resImg, 1);
resImg = max(resImg, 0);
%smooth
if smooth
smooth_d = 6;
smooth_sigma = [3 0.1];
resImg = BilateralFilt2(double(resImg), smooth_d, smooth_sigma);
end
2.8 小结
最终采用了5x5固定大小窗口内做二元高斯回归的方法进行。看情况进行双边滤波器滤波,默认不进行滤波。并利用多组sigma作为Phi的参数,以此适应多噪音比环境下的回归效果。
此后又对程序中给的山水画png进行了测试,0.6噪音比下, 349.2799 - 84.1094,效果如图Figure 16。 0.8噪音比下,403.3304- 108.6377,效果如Figure 17。而用按行一元高斯分布回归则是403.3304 - 186.1008,效果如Figure 18。
分析可知,本算法对于细节丰富、复杂的图像,效果不如趋于统一图像好,在这样的情形下,效果与一元高斯分布回归效果相差不大。但在高噪音比下,效果要明显好于一元高斯分布回归。
Figure 16
Figure 17
Figure 18
3 实验结果
A:
B:
C:
- 二元回归解决图像恢复问题(图像去噪)
- 图像去噪 - Lena
- 图像去噪
- 图像去噪
- 图像去噪
- 图像去噪
- 图像去噪
- 图像去噪算法
- 图像去噪笔记
- 图像去噪处理
- 图像去噪
- 图像去噪
- 图像去噪
- 图像去噪
- 图像去噪
- OpenCV图像去噪
- X射线图像如何去噪(图像增强)如图下
- 灰度图像增强和图像去噪
- mysql 创建索引和删除索引
- shell脚本将text文件中的文件名筛选转化成独立的文件
- opencv读取视频
- postfix邮件管理
- java面试题
- 二元回归解决图像恢复问题(图像去噪)
- Big-man的Bootstrap篇(一)
- 浅析人脸检测之Haar分类器方法
- 二分图——洛谷P1129 [ZJOI2007]矩阵游戏
- 递归算法简单理解(转)
- 第26课: Spark Runtime(Driver、Masster、Worker、Executor)内幕解密
- How Many Nines(ZOJ-3950)
- String painter
- Linux常用基础命令