图像标准化,图像范围和图像缩放不同的图像堆栈
我很困惑与图像规范化,图像范围,图像缩放。 我正在使用一种算法(我已经在上一个问题中上传算法),并且在应用算法之后,我使用维基百科的这个公式来规范图像:
使用来自MATLAB的getrangefromclass(filtImag1{i})
,应用该算法之前的矩阵范围是[0 255],并且在应用该算法之后,范围是[0 1]。
问题是我需要找到一个参考找出标准化公式是否正确? 我也有5堆图像,每个包含600个图像。 我已经为每个堆栈应用了该算法,并且由于算法的结果是每个堆栈有10个图像,我最终将得到50个需要分析并将它们进行比较的图像。 我找到了50幅图像的最大值和最小值,然后将每幅图像传递到公式中以对图像进行归一化处理。
尽管图像的范围是[0 1],但图像的最大值是:max = 3.6714e + 004
为什么? 不应该是1吗? 这是正常化的正确方法吗? 我如何应用缩放? 我需要这样做吗?
这里是规范化代码:
%%%%%%%%%%%%%%Find Min and Max between the results%%%%%%%%%%%%%%%%%%%%%%%
pre_max = max(filtImag1{1}(:));
for i=1:10
new_max = max(filtImag1{i}(:));
if (pre_max<new_max)
pre_max=max(filtImag1{i}(:));
end
end
new_max = pre_max;
pre_min = min(filtImag1{1}(:));
for i=1:10
new_min = min(filtImag1{i}(:));
if (pre_min>new_min)
pre_min = min(filtImag1{i}(:));
end
end
new_min = pre_min;
%%%%%%%%%%%%%%normalization %%%%%%%%%%%%%%%%%%%%%%%
for i=1:10
temp_imag = filtImag1{i}(:,:);
x=isnan(temp_imag);
temp_imag(x)=0;
t_max = max(max(temp_imag));
t_min = min(min(temp_imag));
temp_imag = (double(temp_imag-t_min)).*((double(new_max)-double(new_min))/double(t_max-t_min))+(double(new_min));
imag_test2{i}(:,:) = temp_imag;
end
编辑我已根据建议的答案更改代码,但结果是黑色的图像
%找到它们之间的最大值和最小值pre_max = max(sTStack {1}(:)); 对于i = 1:40 newMax = max(sTStack {i}(:)); 如果(pre_max
pre_min = min(sTStack {1}(:)); 对于i = 1:40 newMin = min(sTStack {i}(:)); 如果(pre_min> newMin)pre_min = min(sTStack {i}(:)); end end t_min = pre_min;
%%%%%%%%%%%%%%%%%%%%%%%标准化图像:%%%%%%%%%%%%%%%%%%%%%%%% %%%%%
对于i = 1:40 NTstack {i} =(sTStack {i} -t_min)/(t_max-t_min); 结束
对于i = 10:10:40的数字,imshow(NTstack {i}); colorbar colormap jet end
您提供的维基百科片段是正确的,可用于使用以下MATLAB代码对图像进行归一化:
%% Create an Example Image:
rand('seed', 1982);
n = 16;
myImg= rand(n,n)*.2 + .5;
%% Normalize the Image:
myRange = getrangefromclass(myImg(1));
newMax = myRange(2);
newMin = myRange(1);
myImgNorm = (myImg - min(myImg(:)))*(newMax - newMin)/(max(myImg(:)) - min(myImg(:))) + newMin;
一些图像的问题是,尽管它们只占用一小部分可能的值。 如果你的值可以在0到1之间,那么黑色将是0,白色将是1.但是,如果你图像中最暗的点是.5,而最亮的点是.7,那么它可能看起来不适合你的处理或者用户何时可视化(请注意,MATLAB的imagesc在显示之前自动对图像进行规范化处理)。
如果使用hist(myImg(:))查看图像的直方图,则可以确定图像实际使用的允许值的必须性。 在规格化图像中,最小值将为0,最大值为1(或您使用的任何范围)。
实现这个公式的一个常见错误是没有正确放置圆括号,在缩放前不减去图像的最小值,或者不加回“newMin”。
你可以在下面的代码和图像中看到所有的东西。 请注意,原始图像(1)仅使用空间的一小部分(2),因此当我们不让图像c自动缩放爬升参数时,看起来会变得模糊不清。 一旦我们归一化(3),然而,图像有非常暗和非常明亮的值,直方图从0延伸到1(4)。 尽管不清楚你的代码是干什么的,但将它与这个例子进行比较可以解决你的问题。
%% Create an Example Image:
rand('seed', 1982);
n = 16;
myImg= rand(n,n)*.2 + .5;
%% Normalize the Image:
myRange = getrangefromclass(myImg(1));
newMax = myRange(2);
newMin = myRange(1);
myImgNorm = (myImg - min(myImg(:)))*(newMax - newMin)/(max(myImg(:)) - min(myImg(:))) + newMin;
%% Display the Image:
figure(42);
clf;
% Display the original:
subplot(2,2,1);
imagesc(myImg);
set(gca, 'clim', [0,1]);;
title('(1) Original Image');
% Display the hist of the original:
subplot(2,2,3);
hist(myImg(:))
xlim([0,1]);
title('(2) Histogram Of Original Image');
% Display the normalized image:
subplot(2,2,2);
imagesc(myImgNorm);
title('(3) Normalized Image');
% Display the hist of the normalized image:
subplot(2,2,4);
hist(myImgNorm(:))
title('(4) Histogram of Normalized Image');
xlim([0,1]);
colormap gray
编辑:
另外,关于getrangefromclass(...)如何解决您的问题还有一些重要的注意事项。 这个函数返回“基于类的图像的默认显示范围”---也就是说,它返回MATLAB认为合理的值范围是用于表示图片的数据类型。 对于uint8数据,这是[0,255]。 对于int16,这是[-32768,32767]。 对于你的情况,加倍,范围[0,1]不是因为这是最小值和最大值,而是因为这是传统和双数据类型有一个特殊的表示,使这个范围相当合理。 请注意,范围与您的数据实际无关。 如果数据量小于或大于最小值和最大值,则与MATLAB认为对图片有用的数据会有很大不同。 在双倍或单一的情况下,您的价值可能会更大。 要将值标准化为[0,1]之间的值,我们可以使用我们一直在讨论的代码。
在这种情况下,我们创建一个具有较大正值和负值的随机图像,但我们会将它们全部缩放到零和一。 也就是说,我们制作最深的颜色0和发光的颜色1,而在最小的一个是负数之前,最大的是正数千。 但是,请注意直方图形状在x轴值变为0,1时是如何保持不变的。 这应该证明为什么MATLAB范围是[0,1],但你的最小/最大值是不同的 - 这很好,你的规范化代码将修复零和一之间的一切。
randn('seed', 1982);
myImg = randn(n,n)*1000;
% Normalize the Image:
myRange = getrangefromclass(myImg(1));
newMax = myRange(2);
newMin = myRange(1);
myImgNorm = (myImg - min(myImg(:)))*(newMax - newMin)/(max(myImg(:)) - min(myImg(:))) + newMin;
% Display the Image:
figure(42);
clf;
% Display the original:
subplot(2,2,1);
imagesc(myImg);
% set(gca, 'clim', [0,1]);;
title('(1) Original Image');
colorbar
% Display the hist of the original:
subplot(2,2,3);
hist(myImg(:))
title('(2) Histogram Of Original Image');
axis tight;
% Display the normalized image:
subplot(2,2,2);
imagesc(myImgNorm);
title('(3) Normalized Image');
colorbar
% Display the hist of the normalized image:
subplot(2,2,4);
hist(myImgNorm(:))
title('(4) Histogram of Normalized Image');
axis tight;
colormap gray
回答你之前的问题后,我想我理解你的困惑。
首先,输入图像的类型为uint8
(因此范围[0,255]),并且由于我们需要对信号执行处理(巴特沃斯滤波),因此有必要将其转换为double
数据类型以避免使值截断。
现在在处理结束时,所得到的“图像”是double
类型的,但具有任意范围(它们表示信号中的平均能量)。 现在,如果我们想要显示这些图像,甚至对它们执行图像处理(您正尝试在原始代码中应用medfilt2
),MATLAB希望double
类型的图像处于[0,1]范围内。
我在代码中使用的公式和刚刚提供的公式是兼容的,只是我正在规范化到[0,1]的范围,因此newMax = 1
和newMin = 0
,并且方程最终只是按照我描述的之前:
img = ( img - min(img(:)) ) ./ ( max(img(:)) - min(img(:)) );
请记住,您应该自行规范每个图像,即计算图像本身的公式中的最小值/最大值,而不是整个图像组。 如果回头看看我提出的解决方案,将图像存储在单元阵列中,然后使用CELLFUN完成计算,分别获得每个图像的最小/最大值:
Tf = cellfun(@(x)reshape((x-min(x))./range(x),sz), Tf, 'Uniform',false);
显然信号被存储为线性化的矢量(每个单元都在一个单元中),因此我们将每个信号归一化到[0,1]范围,然后我们将它重新整形成适当的图像矩阵。
现在,如果您想在uint8
之后回到uint8
图像,只需调用im2uint8
。
我应该补充一点,我们上面执行的线性变换的类型称为最小/最大归一化,但它当然不是唯一的类型(请参阅其他示例的答案)。 人们也可以看看其他对比度增强技术(认为直方图均衡等)
我通常使用图像处理工具箱中的mat2gray
来达到这些目的:mat2gray。 我使用上面提到的完全相同的线性插值。 它在内部叫做imlincomb。
你提到的问题,使我相信你以某种方式错误地实现了上述等式。
链接地址: http://www.djcxy.com/p/79615.html上一篇: image Normalization, image Range and image Scaling for different stack of images
下一篇: c#