2015-10-22 9 views
0

Я пытаюсь передать некоторый код Matlab на C++. Я наткнулся на эту строку:Matlab: Canny edge detector с единственным пороговым значением

edges = edge(gray,'canny',0.1); 

Выход для изображения образца является полностью черное изображение. Я хочу воспроизвести такое же поведение, используя cv :: Canny. Какие значения следует использовать для низкого порога и высокого порога?

Sample Image

Output

+0

Обычно зависит от типа изображения, но вы можете посмотреть на них: http://www.kerrywong.com/2009/05/07/canny-edge-detection -auto-thresholding/или http://stackoverflow.com/questions/4292249/automatic-calculation-of-low-and-high-thresholds-for-the-canny-operation-in-open – ZdaR

+0

Я уже пробовал первый , и он обнаружил множество ребер, где код matlab не обнаружил ни одного. – protas

+0

для уточнения: вы спрашиваете, как положить это 0.1 в opencv? –

ответ

0

В строке выше не определен порог, вероятно, он принимает к нулю, то, таким образом, обеспечивая черную картину. Кроме того, вы используете сигма 0,1, что означает практически отсутствие размытия Гаусса на первом этапе Canny. В Matlab вы можете получить оптимизированную threhold по:

[~, th] = edge(gray,'canny'); 

, а затем применить оптимизированный порог й умножается на некоторый множитель е (из моего опыта е должно быть между 1-3), вы должны попробовать:

edges=edge(gray,'canny',f*th,'both', sigma); 

sigma is sqrt (2) по умолчанию (вы использовали 0.1 выше). После замечания:

  • Matlab рассчитали оптимизированный порог в качестве процентили распределения градиентов интенсивности (вы можете увидеть конструкцию края(), если ввести «редактировать край», если я правильно помню)
  • выше параметр th представляет собой вектор, состоящий из низкого и высокого порога. Matlab всегда использует low_threshold = 0,4 * high_threshold
+0

Итак, это то же самое, что cv :: Canny (m_gray, edge, 255 * 0.4, 255 * 1)? По крайней мере, он дает мне тот же черный выход. Я не писал код matlab, он просто там. Все, что я хочу, чтобы мой код выдавал тот же результат, даже если это черное изображение. – protas

+0

Я думаю, что эквивалентный код openCv: GaussianBlur (m_gray, m_gray, Размер (9,9), 0,1, 0,1); Canny (m_gray, edge, 255 * 0.4, 255 * 1); Это правильно? – protas

+0

Я проверил документ Matlab и нашел следующий синтаксис: BW = edge (I, метод, порог). Пробовал его с изображением серого цвета, он дает нормальный каменный край, белые края на черной земле. Таким образом, 0.1 - это высокий уровень (макс равен 1, т. Е. С 0.99 вы просто получаете несколько ребер, с 0,01 вы получаете миллион ребер. – Settembrini