ISP Matlab 基于多尺度的边缘增强
参考文献:
function [] = ft_multiScaleEnhancement()
close all;
clear all;
clc;
%% 读入图片
fid = './case1/test.bmp';
img_in = imread(fid);
figure,imshow(img_in),title('1');
img_in = double(img_in);
[m, n, d] = size(img_in);
%% 算法参数配置
EndOrder = 2;
Rad = 3;
% h = fspecial('gaussian',hsize,sigma)
% h = fspecial('log',hsize,sigma)
sigma1 = 1.0;
sigma2 = 2.0;
sigma3 = 4.0;
wig1 = 0.5;
wig2 = 0.5;
wig3 = 0.25;
filter_kernel1 = fspecial('gaussian',2*Rad+1 , sigma1);
filter_kernel2 = fspecial('gaussian',2*Rad+1 , sigma2);
filter_kernel3 = fspecial('gaussian',2*Rad+1 , sigma3);
%% 算法主体
B1 = imfilter(img_in,filter_kernel1,'symmetric');
B2 = imfilter(img_in,filter_kernel1,'symmetric');
B3 = imfilter(img_in,filter_kernel1,'symmetric');
D1 = img_in - B1;
D2 = B1 - B2;
D3 = B2 - B3;
D = (1-wig1.*get_sgn(D1)).*D1 + wig2.*D2 + wig3.*D3;
% figure, imshow(uint8(D(:,:,:).*128)),title('D');
figure, mesh(D(:,:,1)), title('D R');
figure, mesh(D(:,:,2)), title('D G');
figure, mesh(D(:,:,3)), title('D B');
%% 输出图像
img_out_pre = img_in + EndOrder.*D;
img_out = img_out_pre;
overflow_cnt = 0;
for ch = 1:1:d
for rows = 1:1:m
for cols = 1:1:n
if img_out(rows, cols, ch) > 255
img_out(rows, cols, ch) = 255;
overflow_cnt = overflow_cnt + 1;
elseif img_out(rows, cols, ch) < 0
img_out(rows, cols, ch) = 0;
end
end
end
end
figure, imshow(uint8(img_out(:,:,:))),title('2');
keyboard
end
%% local function
function [var_sgn] = get_sgn(var_in)
% var_in : 输入函数变量
% var_sgn: 输出函数符号位
[m, n, d] = size(var_in)
var_sgn = zeros(m, n, d);
for ch = 1:1:d
for rows = 1:1:m
for cols = 1:1:n
if var_in(rows, cols, ch) < 0
var_sgn(rows, cols, ch) = -1;
else
var_sgn(rows, cols, ch) = 1;
end
end
end
end
end
如果FPGA资源足够,这个算法实现起来复杂度并不是太高,效果还行。