@Timebird

Как найти толщину рамки в изображении?

Имеется изображение с рамкой (вся рамка - одного цвета), толщина рамки сверху, снизу, слева и справа различная. Необходимо найти толщину с каждой стороны.

Подскажите, пожалуйста, алгоритм, по которому можно вычислить толщину рамки, если у нее не фиксированная длина.

Сам пробовал так:
for i in range(width): # Цикл идет СЛЕВА 
		for j in range(height): # Цикл идет СВЕРХУ
			if not np.array_equal(img[i,j], border_color): # если вдруг пиксели стали не равны цвету рамки
				border[0] = i # граница СЛЕВА
				border[1] = j # граница СВЕРХУ

Но таким образом я вычисляю координаты точки, где рамка заканчивается лишь слева-сверху. Всё бы хорошо, но даже зная эти координаты не доходит - как следовать дальше? Рамка-то с разных сторон имеет разную толщину.
Нужно найти координаты справа-снизу? А как заставить цикл следовать по изображению в таком направлении? Я вообще на верном пути, или подход в корне неверный? Может, готовая функция какая-то для этого предусмотрена?
  • Вопрос задан
  • 393 просмотра
Пригласить эксперта
Ответы на вопрос 3
15432
@15432
Системный программист ^_^
в своих проектах я каждую границу отдельно находил. у вас к тому же не учитывается вариант, что только один пиксель в строке будет border_color, а вы посчитаете эту строку за рамку. Нужно проверять, что все пиксели в конкретной строке имеют border_color

#find left border
left_border = width - 1
for i in range(0, width):
    border_ended = False
    for j in range(0, height): #we must ensure all pixels on this column have border_color
        if not np.array_equal(img[i,j], border_color):
            border_ended = True
            left_border = i
            break
    if border_ended:
        break
            
#find right border. same, but reversed, from right to left
right_border = 0
for i in reversed(range(0, width)):
    border_ended = False
    for j in range(0, height):
        if not np.array_equal(img[i,j], border_color):
            border_ended = True
            right_border = i
            break
    if border_ended:
        break
        
#top border
top_border = height-1
for j in range(0, height):
    border_ended = False
    for i in range(0, width):
        if not np.array_equal(img[i,j], border_color):
            border_ended = True
            top_border = j
            break
    if border_ended:
        break
        
#bottom border
bottom_border = height-1
for j in reversed(range(0, height)):
    border_ended = False
    for i in range(0, width):
        if not np.array_equal(img[i,j], border_color):
            border_ended = True
            bottom_border = j
            break
    if border_ended:
        break
Ответ написан
@D3Nd3R
Решаем с помощью openCV.
1. Пороговая обработка (все что != цвету рамки -> 0, иначе 1);
2. Находим границы с помощью canny;
3. Находим контуры(findContours с флагом RETR_EXTERNAL) найти самый длинный. Это по идее будет внутренняя сторона рамки.
4. Апроксимируем контур (convexHull)
5. Зная левую верхнюю и правую нижнюю точки, можно найти рамки.
толщина левой = Xmin;
толщина верхней = Ymin;
толщина правой = w - Xmax;
толщина нижней = р - Ymax;
Ответ написан
dimonchik2013
@dimonchik2013
...нечеловечески он пел, нечеловечески танцуя...
чоткие пацаны юзают OpenCV

по-моему, есть примеры и попроще, поищи OpenCV + Frame/Border
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы