Как я могу настроить грубое преобразование в MATLAB, чтобы обнаружить больше строк для обнаружения шахматной доски? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь написать алгоритм для определения паттернов шахматной доски.Я знаю, что в MATLAB есть встроенная функция для этого, но я хочу сделать это самостоятельно.

В любом случае, у меня есть около 30 изображений шахматного рисунка, которые показаны камере в разных положениях.Я уже разработал алгоритм поиска интересующей области с помощью regionprops, который работает достаточно хорошо.Однако, когда я применяю хитрый фильтр на фотографии для определения краев, а затем нахождения линий, преобразование Хафа не может обнаружить некоторые линии, которые должны быть обнаружены на нескольких фотографиях.Например, см. Рисунок 1 и рисунок 2.

Вот MCV моего кода, чтобы увидеть мой шаг предварительной обработки и мои текущие параметры преобразования Хафа:

img = imread('checkerboard13.jpg');
bw = im2bw(img, graythresh(img));
bw = medfilt2(bw, [9,9]);
BW = edge(bw);
[H,T,R] = hough(BW);
P = houghpeaks(H, 100,'NHoodSize',[1 1],'threshold',ceil(0.01*max(H(:))));
lines = houghlines(BW, T, R, P, 'FillGap', 80, 'MinLength', 400);
x = T(P(:,2)); y = R(P(:,1));
figure;
    imagesc(I);hold on;colormap gray;
    axis image; 
    max_len = 0;
    for k = 1:length(lines)
       xy = [lines(k).point1; lines(k).point2];
       plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
       plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
       plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
       len = norm(lines(k).point1 - lines(k).point2);
       if ( len > max_len)
          max_len = len;
          xy_long = xy;
       end
    end

enter image description here enter image description here enter image description here enter image description here

1 Ответ

0 голосов
/ 19 декабря 2018

Итак, как я сказал в комментариях, вы должны поиграть с параметрами для расширения и жестких линий.

Проблема: линии, которые вы ищете, в частности линии платы проверки, очень тонкие и не соединены.Следовательно, можно использовать только линии Houghlines, но требуется много настроек параметров.

Решение: Расширьте изображение, прежде чем наложить неровные линии, и соответственно отрегулируйте параметры для ночных линий.

Расширение - это, по сути, морфологическая операция, в которой элемент пикселя равен '1', если хотя бы один пиксель под ядром равен '1'.Таким образом, увеличивается белая область на изображении или увеличивается размер объекта переднего плана.В качестве альтернативы вы также можете попробовать использовать Открытие , которое в основном является эрозией (противоположной дилатации) + дилатация.

Параметры для Houghlines:

Функция OpenCV :

lines = cv.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

Наиболее важными параметрами в вашем случае являются:

threshold - Решает, какие строки учитывать, только выбираются линии с интенсивностью> порог .

minLineLength - Как видно из названия, это определяет, какой должна быть минимальная длина линии (в пикселях), равная классифицируется как линия

maxLineGap - Вероятно, второй самый важный параметр, если не самый важный (жесткая конкуренция с порогом), это определяет, что должно быть максимальный зазор между двумя строками, которые должны быть отнесены к одной строке .

Другие параметры:

rho : разрешение по расстоянию в пикселях, 1 здесь

тета : разрешение по углу в радиans, 1 здесь

Для хорошего урока, посмотрите , как работает грубое преобразование?

Использование OpenCV со следующим кодом:

import cv2
import numpy as np

image1 = cv2.imread('lines.jpg')
output = image1
image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

canny = cv2.Canny(image1, 100, 200)
canny = cv2.dilate(canny, (5,5), 7)
lines = cv2.HoughLinesP(canny, 1, np.pi/360, 120, minLineLength=200, maxLineGap=30)

for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(output, (x1, y1), (x2, y2), (0, 255, 0), 2)

cv2.imwrite("lines_res.jpg", output)

Исходное изображение:

Original

Результат:

Result

Надеждаэто помогает!Дайте мне знать, что вы думаете!

...