Извините, я не знаю OpenCV, и это скорее этап предварительной обработки, чем полный ответ:
Во-первых, вам не нужен детектор краев. Детектор кромки преобразует переходы (например, из темного в светлое):
в гребни (яркие линии на темном), как это:
Другими словами, он выполняет дифференциацию.
Но на ваших изображениях есть свет, сияющий вниз в одном направлении, который показывает нам рельеф трехмерной поверхности. Мы воспринимаем это как линии и края, потому что мы привыкли видеть вещи в 3D, но на самом деле это не так, поэтому детекторы краев не работают, а сопоставление с шаблоном не будет легко работать с повернутыми изображениями (идеальный вариант). совпадение при повороте на 0 градусов фактически полностью отменило бы на 180 градусов, потому что свет и темнота совпали бы друг с другом).
Если высота одной из этих лабиринтных линий выглядит так со стороны:
тогда функция яркости при освещении с одной стороны будет выглядеть так:
Это то, что вы видите на своих изображениях. Облицовочная поверхность становится ярче, а задняя поверхность становится темнее. Таким образом, вы не хотите дифференцироваться. Вам необходимо интегрировать изображение по направлению освещения, и оно даст вам исходную карту высот поверхности (приблизительно). Тогда будет проще сопоставлять вещи, будь то через преобразование Хафа, сопоставление с шаблоном или что-то еще.
Я не уверен, как автоматизировать поиск направления освещения. Если это одинаково для всех ваших изображений, отлично. В противном случае вам придется найти самую большую контрастную линию и предположить, что свет перпендикулярен ей или чему-то еще. Для моего примера я повернул изображение вручную в правильном направлении со светом слева:
Вам также необходимо удалить все низкочастотные изменения в изображении, чтобы выделить только быстро меняющиеся линейные элементы. Чтобы избежать звона артефактов, я использовал 2D Gaussian Blur, а затем вычел это из оригинала:
Интеграция (накопленная сумма) может легко убежать, что приводит к горизонтальным полосам. Я удалил их с другим гауссовым верхним проходом, но только в горизонтальном направлении:
Теперь устьицы - это белые эллипсы, а не белые в некоторых местах и черные в других.
Оригинал:
Интегрированное:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
Преобразование Хафа может быть использовано для обнаружения таких ребристых эллипсов, сделанных из «краевых пикселей», хотя это действительно дорого для вычислений и памяти, и они не являются идеальными эллипсами, так что это должен быть немного «неаккуратный» детектор. Я никогда не делал этого, но есть много результатов Google для " обнаружения крутого эллипса ". Я бы сказал, что если вы обнаружите один эллипс внутри другого, в пределах пространства поиска определенного размера, его следует считать стомой.
Также см: