Проблема: Я хочу обнаружить строки в данном изображении, используя OpenCV в Python.Хотя существует множество очевидных вертикальных линий, ни нормальные HoughLines, ни вероятностные HoughLines не находят их.Поскольку я провел много времени, играя с параметрами, я думаю, что я делаю что-то фундаментальное неправильно здесь.Мне известно о том факте, что на краях, как правило, после нанесения кайны, обычно наносятся штрихи.Из-за максимального подавления canny's, canny здесь не дает хороших результатов.
Изображение, где обнаруживаются вертикальные линии Сбои:
Почему: Учитывая это (изображение счетчика воды):
Я хочу обнаружить прямоугольник вокругкаждая цифра.Чтобы обнаружить прямоугольники, я использовал фильтры sobel в направлении x и y и рассчитал величину и угол / фазу градиента.Предполагая, что на этом этапе изображение будет правильно повернуто, я извлекаю вертикальные и горизонтальные края, как показано на рисунке.Я надеялся использовать houghLines, чтобы найти ограничивающие рамки.Поиск горизонтальных линий работает отлично, как видно на графике отладки
, содержащем дальнейшее понимание проблемы, где я не работаю с вертикальными компонентами (второй ряд):
Обнаружение прямоугольников вокруг каждой цифры поможет мне
- найти интересующую область
- вырезать область внутри прямоугольника,другими словами цифра.У нескольких других подходов для непосредственного определения цифр с помощью контуров возникла проблема с внешними прямоугольниками, мешающими цифре.
Обновление: код для обнаружения вертикальных линий:
#img is initialized with the binarized, vertical component image, as shown above
minLength = 30
maxGap = 7
angle_res = np.pi / 180
rad_res = 2
threshold_val = 100
linesP = cv2.HoughLinesP(img, rad_res, angle_res, threshold_val, minLineLength=minLength, maxLineGap=maxGap)
cdst = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cdstP = np.copy(cdst)
if linesP is None:
print("Error when finding lines (probabilistic hough transformation). No lines detected")
else:
# Copy edges to the images that will display the results in BGR
for i in range(0, len(linesP)):
l = linesP[i][0]
cv2.line(cdstP, (l[0], l[1]), (l[2], l[3]), (255,0,0), 3, cv2.LINE_AA)
plt.imshow(cdstP); plt.show()