输出图像显示不正确
Output image not displaying properly
我目前正在编写一段代码,为阈值处理准备图像,尽管输出图像和返回的像素数据之间似乎不匹配。
我将通过代码告诉您。首先,我定义了带有三个参数的函数 - IMAGE
,将被阈值化的图像; r
定义中心像素周围邻域的半径,可以从中计算像素数据;和 k
,决定阈值细节的 'kernel'。
function [t] = imadaptive ( IMAGE, r, k )
然后我调用我之前定义的函数,这些函数创建图像,其中存储了每个像素的均值和标准差:
meanpic = immean (IMAGE, r);
stdpic = imstd (IMAGE, r);
接下来,我创建一个新图像 t
,其中每个像素的强度为 0。这将用于存储每个像素的适当阈值:
t = zeros(size(IMAGE));
然后我计算出图像的大小来告诉 for 循环何时停止:
[nx, ny] = size(IMAGE);
接下来,我启动 for 循环和 运行 一系列 if 语句,以阻止程序尝试检查 (-2,-2):[=24= 等位置的像素值]
if x-r <= 0
startx = 1;
else
startx = x-r;
end
if x+r > nx
endx = nx;
else
endx = x+r;
end
if y-r <= 0
starty = 1;
else
starty = y-r;
end
if y+r > ny
endy = ny;
else
endy = y+r;
end
最后,我 运行 计算出每个像素的适当阈值的代码,然后将该值添加到图像 t
:
R = 128;
for xp = startx : endx
for yp = starty : endy
if (x-xp)^2 + (y-yp)^2 <= r^2
thresh = meanpic(xp,yp) * (1 + (k * (((stdpic(xp,yp) / R) - 1))));
end
end
end
t(x,y) = thresh;
问题是:当我 运行 这段代码时,我得到的图像与我的 stdpic
相同:该图片显示了每个图像的标准偏差值。不过,我不明白这是为什么。该等式似乎是正确的 - 当我从等式中删除 ;
时,我看到它输出的值变化很大,介于 0 和 255 之间,因此输出图像 t
看起来应该大不相同.
任何人都可以指出我这里有什么问题吗?
每次循环都会重新分配thresh
。因此,邻域中只有一个像素对每个输出像素有贡献。如果更改 thresh 没有帮助,请 post 在此处或在 pastebin 上 post 整个文件好吗?演练格式非常有用,但错误总是可能出现在未显示的代码中。
编辑:在粘贴的第 163-165 行,将 uint8
更改为 double
。在第 211 行,添加代码以使用像素计数或类似的东西。我认为 R
的除法发生在 uint
中并截断为零。在最后,在数学之后改回 uint
,否则 imshow
不会给您预期的结果。希望这对您有所帮助!
我目前正在编写一段代码,为阈值处理准备图像,尽管输出图像和返回的像素数据之间似乎不匹配。
我将通过代码告诉您。首先,我定义了带有三个参数的函数 - IMAGE
,将被阈值化的图像; r
定义中心像素周围邻域的半径,可以从中计算像素数据;和 k
,决定阈值细节的 'kernel'。
function [t] = imadaptive ( IMAGE, r, k )
然后我调用我之前定义的函数,这些函数创建图像,其中存储了每个像素的均值和标准差:
meanpic = immean (IMAGE, r);
stdpic = imstd (IMAGE, r);
接下来,我创建一个新图像 t
,其中每个像素的强度为 0。这将用于存储每个像素的适当阈值:
t = zeros(size(IMAGE));
然后我计算出图像的大小来告诉 for 循环何时停止:
[nx, ny] = size(IMAGE);
接下来,我启动 for 循环和 运行 一系列 if 语句,以阻止程序尝试检查 (-2,-2):[=24= 等位置的像素值]
if x-r <= 0
startx = 1;
else
startx = x-r;
end
if x+r > nx
endx = nx;
else
endx = x+r;
end
if y-r <= 0
starty = 1;
else
starty = y-r;
end
if y+r > ny
endy = ny;
else
endy = y+r;
end
最后,我 运行 计算出每个像素的适当阈值的代码,然后将该值添加到图像 t
:
R = 128;
for xp = startx : endx
for yp = starty : endy
if (x-xp)^2 + (y-yp)^2 <= r^2
thresh = meanpic(xp,yp) * (1 + (k * (((stdpic(xp,yp) / R) - 1))));
end
end
end
t(x,y) = thresh;
问题是:当我 运行 这段代码时,我得到的图像与我的 stdpic
相同:该图片显示了每个图像的标准偏差值。不过,我不明白这是为什么。该等式似乎是正确的 - 当我从等式中删除 ;
时,我看到它输出的值变化很大,介于 0 和 255 之间,因此输出图像 t
看起来应该大不相同.
任何人都可以指出我这里有什么问题吗?
每次循环都会重新分配thresh
。因此,邻域中只有一个像素对每个输出像素有贡献。如果更改 thresh 没有帮助,请 post 在此处或在 pastebin 上 post 整个文件好吗?演练格式非常有用,但错误总是可能出现在未显示的代码中。
编辑:在粘贴的第 163-165 行,将 uint8
更改为 double
。在第 211 行,添加代码以使用像素计数或类似的东西。我认为 R
的除法发生在 uint
中并截断为零。在最后,在数学之后改回 uint
,否则 imshow
不会给您预期的结果。希望这对您有所帮助!