注意:另一种尝试方法可能包括移动/窗口平均值来计算要偏移的本地量。
方法一:离散余弦变换(DC偏移去除)
使用离散傅里叶变换 (DCT) 将图像转换为频域。移除矩阵左上角(设置为零)的 DC 系数,并使用逆离散傅里叶变换 (IDCT) 将其转换回空间域。
Image = imread("Test_Image.jpg");
%Converting image to greyscale if RGB image%
[Image_Height,Image_Width,Depth] = size(Image);
if(Depth == 3)
Image = rgb2gray(Image);
end
%Removing image offset%
Discrete_Cosine_Transformed_Image = dct2(Image);
Discrete_Cosine_Transformed_Image(1,1) = 0;
Inverse_Discrete_Cosine_Transformed_Image = idct2(Discrete_Cosine_Transformed_Image);
Calibrated_Image = medfilt2(Inverse_Discrete_Cosine_Transformed_Image,[20 20]);
% Plotting the original and thresholded image%
X_Axes = (1:1:Image_Height);
Y_Axes = (1:1:Image_Width);
subplot(1,2,1); surf(X_Axes,Y_Axes,Image,'EdgeColor','none');
title("Original Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
subplot(1,2,2); surf(X_Axes,Y_Axes,uint8(Calibrated_Image),'EdgeColor','none');
title("Calibrated Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
关键离散余弦变换 (DCT) 过滤代码行
%Removing image offset%
Discrete_Cosine_Transformed_Image = dct2(Image);
Discrete_Cosine_Transformed_Image(1,1) = 0;
Inverse_Discrete_Cosine_Transformed_Image = idct2(Discrete_Cosine_Transformed_Image)
方法 2:标准统一偏移(无倾斜调节)
使用一个常数值并在整个图像矩阵中减去该值。
测试图像 1:使用最低强度计算偏移量
测试图像 2:使用平均值/平均值计算偏移量
Image = imread("Circular_Image.png");
%Converting image to greyscale if RGB image%
[Image_Height,Image_Width,Depth] = size(Image);
if(Depth == 3)
Image = rgb2gray(Image);
end
%Removing image offset%
Lowest_Intensity_Value = min(Image,[],'all');
Average = mean(Image,'all');
Calibrated_Image = Image - Average;
% Plotting the original and thresholded image%
X_Axes = (1:1:Image_Height);
Y_Axes = (1:1:Image_Width);
subplot(1,2,1); surf(X_Axes,Y_Axes,Image,'EdgeColor','none');
title("Original Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
subplot(1,2,2); surf(X_Axes,Y_Axes,Calibrated_Image,'EdgeColor','none');
title("Calibrated Image Plot");
xlabel('X-Axis'); ylabel('Y-Label');
zlim([0 255]);
使用 MATLAB 版本:R2019b