我想在我的隐写算法中使用canny边缘检测,所以当我需要250像素的隐藏信息时,我必须找到最佳的低/高阈值,以便在图像中找到至少250个最清晰的像素。
另一个例子,当我需要500像素的隐藏信息时,我必须找到低/高阈值才能在图像中找到至少500像素。
我认为我可以使用二进制搜索,但它不会返回最佳阈值。这是我的二分搜索功能:
function [ th ] = getThreshold( I, N, w )
% limit is set to 1% of the message
% length
% no. of edge pixels,ne ? N + 0.01 × N
% and ne ? N
% ne = number of edge pixels in I, when
% Canny edge detector is used on I with
% high threshold th and low threshold
% tl = 0.4 ? th and width w
limit = (0.01 * N);
tmax = 0.8;
tmin = 0;
set = true;
while(set)
th = double((tmax + tmin)/2);
BW = edge(I,'canny',[tmin tmax],'both',w);
% it returns the number of pixels in the edges obtained through Canny
% edge detector
ne = getEdgePixelCount(BW);
diff = ne - N;
if diff > limit
tmin = th;
elseif diff < 0
tmax = th;
else
set = false;
end
end
答案 0 :(得分:0)
您是否检查过MATLAB自身应用的优化阈值?从您拥有的MATLAB文档:
在所有情况下,边缘会根据输入数据启发式地选择默认阈值。改变阈值的最佳方法是运行边缘一次,将计算的阈值捕获为第二个输出参数。然后,从边缘计算的值开始,将阈值调整得更高(边缘像素更少)或更低(更多边缘像素)。&gt;&gt;
因此,为了获得针对canny的MATLAB优化阈值,您可以使用
[~, th] = edge(yourpicture,'canny');
然后应用优化的阈值乘以某个因子f(从我的经验f应该在1-3之间),你必须尝试:
edgepict = edge(yourpicture,&#39; canny&#39;,f * th,&#39; both&#39;,sigma);
请注意,这实际上是一个包含th_low和th_high的向量。 Th_low默认为0.4 * th_high(如果我没记错的话),我不会改变它。除了因子f之外,您还可以使用默认为sqrt(2)的sigma。 Sigma指的是在canny算法的第一步中应用的高斯模糊的半径。