Matlab水下图像清晰度指标UISM的介绍和代码
时间: 2023-07-15 12:11:47 浏览: 162
UISM(Underwater Image Sharpness Metric)是一种用于评估水下图像清晰度的指标。该指标基于归一化互信息(Normalized Mutual Information,NMI)和梯度能量(Gradient Energy,GE)两个因素。在计算UISM值之前,需要对水下图像进行预处理,包括白平衡、颜色校正、对比度增强等操作。
下面是Matlab实现UISM指标的代码:
```matlab
function uism_value = UISM(img)
% img: 输入的水下图像
% 预处理
img = im2double(img);
img = underwater_image_enhancement(img);
% 计算梯度能量
[Gx, Gy] = imgradientxy(img);
GE = sqrt(Gx.^2 + Gy.^2);
GE = GE ./ max(GE(:));
% 计算归一化互信息
NMI = normalized_mutual_information(img);
% 计算UISM值
uism_value = mean2(GE .* NMI);
end
function NMI = normalized_mutual_information(img)
% 计算归一化互信息
% 将图像转换为灰度图
if(size(img, 3) > 1)
img = rgb2gray(img);
end
% 直方图均衡化
img = histeq(img);
% 计算归一化互信息
NMI = mutual_information(img) ./ (entropy(img) + entropy(img') - mutual_information(img));
end
function MI = mutual_information(img)
% 计算互信息
% 将图像转换为灰度图
if(size(img, 3) > 1)
img = rgb2gray(img);
end
% 直方图均衡化
img = histeq(img);
% 计算互信息
[N, ~] = histcounts(img, 'Normalization', 'probability');
[M, ~] = histcounts(img', 'Normalization', 'probability');
NM = N' * M;
NM(NM == 0) = 1;
MI = log2(NM) .* NM;
% 积分计算互信息
MI = sum(MI(:));
end
function H = entropy(img)
% 计算熵
% 将图像转换为灰度图
if(size(img, 3) > 1)
img = rgb2gray(img);
end
% 直方图均衡化
img = histeq(img);
% 计算熵
[N, ~] = histcounts(img, 'Normalization', 'probability');
N(N == 0) = 1;
H = -sum(N .* log2(N(:)));
end
function img_enhanced = underwater_image_enhancement(img)
% 水下图像增强
% 白平衡
img_wb = white_balance(img);
% 颜色校正
img_cc = color_correction(img_wb);
% 对比度增强
img_enhanced = imadjust(img_cc);
end
function img_wb = white_balance(img)
% 白平衡
% 将图像转换为灰度图
if(size(img, 3) > 1)
img_gray = rgb2gray(img);
else
img_gray = img;
end
% 计算场景光谱
S = get_scene_spectrum(img_gray);
% 白平衡
img_wb = img ./ S;
end
function S = get_scene_spectrum(img_gray)
% 计算场景光谱
% 计算图像直方图
[counts, bins] = imhist(img_gray);
% 计算直方图峰值点
[~, maxIndex] = max(counts);
% 根据峰值点分割图像
thresh = bins(maxIndex);
img_thresh = img_gray > thresh;
% 计算场景光谱
S = zeros(size(img_gray));
S(img_thresh) = img_gray(img_thresh);
S = S ./ max(S(:));
end
function img_cc = color_correction(img_wb)
% 颜色校正
% 计算颜色校正矩阵
A = get_color_correction_matrix(img_wb);
% 颜色校正
img_cc = img_wb;
for i = 1:3
img_cc(:, :, i) = img_wb(:, :, i) * A(i, i) + A(i, 4);
end
end
function A = get_color_correction_matrix(img_wb)
% 计算颜色校正矩阵
% 将图像转换为灰度图
if(size(img_wb, 3) > 1)
img_gray = rgb2gray(img_wb);
else
img_gray = img_wb;
end
% 获取颜色均值
R_mean = mean2(img_wb(:, :, 1));
G_mean = mean2(img_wb(:, :, 2));
B_mean = mean2(img_wb(:, :, 3));
I_mean = mean2(img_gray);
% 构造对角矩阵
D = [R_mean / I_mean, 0, 0; 0, G_mean / I_mean, 0; 0, 0, B_mean / I_mean];
% 求解颜色校正矩阵
I = ones(size(img_wb, 1), size(img_wb, 2));
X = [img_wb(:, :, 1) ./ img_gray, img_wb(:, :, 2) ./ img_gray, img_wb(:, :, 3) ./ img_gray, I];
Y = [D(1, 1) * I, 0 * I, 0 * I, R_mean / I_mean * I; 0 * I, D(2, 2) * I, 0 * I, G_mean / I_mean * I; 0 * I, 0 * I, D(3, 3) * I, B_mean / I_mean * I];
A = (X' * X) \ (X' * Y);
end
```
使用方法:
将上述代码保存为.m文件,然后将需要评估的水下图像作为参数传递给UISM函数,即可得到该图像的UISM值。例如:
```matlab
img = imread('underwater_image.jpg');
uism_value = UISM(img);
```
需要注意的是,预处理过程中的白平衡、颜色校正和对比度增强等操作可能会对UISM值产生影响,因此可以根据具体情况选择是否进行这些操作。