找到任意像素数的最佳高/低canny阈值

时间:2015-10-07 06:32:49

标签: matlab image-processing

我想在我的隐写算法中使用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

1 个答案:

答案 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算法的第一步中应用的高斯模糊的半径。