【问题标题】:Matlab Image Baseline (Offset Removal) CorrectionMatlab 图像基线(偏移去除)校正
【发布时间】:2021-01-20 21:56:23
【问题描述】:

我有这个情节:

并希望使用 Matlab 展平其基线/减少偏移。

基本上就像光谱的基线校正,但在这里我有一个网格,无法理解它如何在处理矩阵时展平其基线?基本上点应该保留,但周围实际上为零。不过,噪音可以保留。

图片如下:

我想知道这样的事情是否有效:

        for x=1:1201
        for y=1:1201
             Ibasetest = polyfit(x,y,1);
        end
        end

只需为 Z 数据沿 Y 的每个 X 做一个基线。但我无法让它工作。 :(

【问题讨论】:

  • 如何处理一个简单的信号?你会使用什么基线移除技术?您的输入和预期输出是什么?
  • 只是非常基本的。中间的点应该保留,但我想删除它周围的偏移量。目前它的偏移量为 10 到 60。这应该被拉低到 0。应该做简单的线性拟合。休息我可以通过玩来学习。
  • 您是否愿意发布您使用的输入图像?这可能会使玩和测试一些方法变得更容易。
  • 附加:) 所以基本上黑暗的周围应该是黑色的。噪音可以停留。我只想删除偏移量。它不是一个恒定的偏移量(这很容易),但图像基线有一个倾斜。
  • 哦,刚刚注意到你的评论。我会尽量适应倾斜并编辑我的答案。

标签: matlab curve-fitting baseline


【解决方案1】:

注意:另一种尝试方法可能包括移动/窗口平均值来计算要偏移的本地量。

方法一:离散余弦变换(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

【讨论】:

  • 哦,好吧。我想要一个简单的函数来删除偏移量/基线,即使是线性回归。线图超级简单,但我无法用 2D 完成。
  • @nolimits 在这个上也有同样的感觉。如果我找到更简洁和简单的方法,我会告诉你。
  • 我尝试了一个循环,对每个 X、Y 进行切片并执行基线减法矩阵,但并没有真正起作用。 % for x=1:1201 % for y=1:​​1201 % Ibasetest = polyfit(x,y,1); % 结束 % 结束 %
  • 这是一个有趣的想法,我必须研究一下。
  • 我认为它为沿 Y 方向的每条 X 线提供了一个线性基线。基本上 Y = 1200 个有一条线的图。那么这应该对 X 方向的每个 Y 进行,对吗?然后从实际图像中减去它。
猜你喜欢
  • 2021-01-23
  • 2013-06-21
  • 2018-12-20
  • 2015-11-16
  • 2013-09-07
  • 2014-11-02
  • 1970-01-01
  • 2013-12-29
  • 2022-01-07
相关资源
最近更新 更多