我目前正处理一段代码,它采用中心像素(x,y)和半径r,然后找到该圆形样本中每个像素的平均强度。
到目前为止,这是我的代码:
function [average] = immean(x, y, r, IMAGE)
%Initialise the variables, total and pixelcount, which will be used to
%collect the sum of the pixel intensities and the number of pixels used to
%create this total.
total = 0;
pixelcount = 0;
%Find the maximum width, nx, and maximum height, ny, of the image - so that
%it can be used to end the for-loop at the appropriate positions.
[nx ny] = size(IMAGE);
%Loop through all pixels and check whether each one falls within the range
%of the circle (specified by its x-and-y-coordinates and its radius, r).
%If a pixel does fall within that domain, its intensity is added to the
%total and the pixelcount increments.
for i = 1:nx
for j = 1:ny
if (x-i)^2 + (y-j)^2 <= r^2
total = total + IMAGE(i, j);
pixelcount = pixelcount + 1;
end
end
end
然而,问题是,当我打印出total
时,我不断得到值255.我认为这是因为MatLab知道像素的最大强度是255,所以它会阻止{{1从大于那个。那么如何将此像素强度转换为普通整数,以便MatLab不会将total
限制为255?
答案 0 :(得分:3)
根据Divakar的评论,您选择double
主要是为了提高位精度,以及MATLAB以这种方式自然地处理数组。此外,当您获取事物的平均值时,您还想要具有浮点精度,因为找到某些事物的平均值将不可避免地为您提供浮点值。
我有点困惑为什么你不想在平均值之后保持小数点,特别是在准确性方面。但是,这不是一个关于意图的问题,但这是一个问题,即你想要做什么,并在你的问题中提出。因此,如果您不想要小数点,只需将图像转换为高于8位的整数精度,以避免剪切。像uint32
之类的东西,这样你得到一个32位无符号整数,甚至是64位无符号整数的uint64
。要最小化剪裁,请转换为uint64
。因此,只需:
IMAGE = uint64(IMAGE);
在进行任何处理之前,请在函数开头执行此操作。