Matlab - Обратное преобразование Hough [дубликат]

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

1
задан Chris Jones 6 February 2015 в 02:12
поделиться

1 ответ

Если вы вспомните параметризацию пространства Хоу, то прямая связь между rho, theta и x,y такова:

rho = x*cos(theta) + y*sin(theta)

Имейте в виду, что x,y представляют столбцов и строк соответственно. Кроме того, начало координат определяется в верхнем левом углу изображения. Теперь, когда вы хотите построить уравнение линии, у вас есть rho и theta. Просто переустановите уравнение так, чтобы вы могли решить уравнение линии формы y = mx + b:

[/g3]

Таким образом, просто цикл над каждой rho и theta вы имеете и нарисуете линию, которая начинается с начала координат в x = 0 до предела вашего изображения x = width-1. Однако, поскольку MATLAB является 1-индексированным, нам нужно перейти от x = 1 к x = width. Предположим, что ваши rho и theta хранятся в отдельных массивах одинаковой длины, и у вас есть ваше реберное изображение, сохраненное в im, вы можете сделать что-то вроде этого:

imshow(im); %// Show the image
hold on; %// Hold so we can draw lines
numLines = numel(rho); %// or numel(theta);

%// These are constant and never change
x0 = 1;
xend = size(im,2); %// Get the width of the image

%// For each rho,theta pair...
for idx = 1 : numLines
    r = rho(idx); th = theta(idx); %// Get rho and theta
    %// Compute starting y coordinate
    y0 = (-cosd(th)/sind(th))*x0 + (r / sind(th)); %// Note theta in degrees to respect your convention

    %// Compute ending y coordinate
    yend = (-cosd(th)/sind(th))*xend + (r / sind(th));

    %// Draw the line
    line([x0 xend], [y0 yend], 'Color', 'blue');
end

код довольно прост. Сначала покажите изображение, используя imshow в MATLAB. Затем используйте hold on, чтобы мы могли нарисовать наши строки на изображении, которое будет отображаться поверх изображения. Затем мы вычислим, сколько пар rho,theta есть, а затем мы определяем, что две x координаты равны 1 и width, поскольку мы будем использовать их для определения, где начальные и конечные y координаты, учитывая эти x. Затем для каждой пары rho,theta мы определим соответствующие координаты y, а затем line , чтобы нарисовать линию от начальных и конечных координат (x,y) синим цветом. Мы повторяем это до тех пор, пока не закончим строки.

Не беспокойтесь, если создаваемые координаты y выходят за рамки изображения. line будет достаточно интеллектуальным, чтобы просто ограничить результат.

Когда theta = 0

Приведенный выше код работает, предполагая, что у вас нет вертикальных линий, обнаруженных в преобразовании Hough, или когда theta = 0. Если theta = 0 (как в вашем случае), это означает, что у нас есть вертикальная линия, которая, таким образом, приведет к бесконечному наклону, и наша формулировка y = mx + b недействительна. Если theta = 0, уравнение линии становится x = rho. Таким образом, вам понадобится дополнительный оператор if в вашем цикле, который обнаружит это:

imshow(im); %// Show the image
hold on; %// Hold so we can draw lines
numLines = numel(rho); %// or numel(theta);

%// These are constant and never change
x0 = 1;
xend = size(im,2); %// Get the width of the image

%// For each rho,theta pair...
for idx = 1 : numLines
    r = rho(idx); th = theta(idx); %// Get rho and theta

    %// if a vertical line, then draw a vertical line centered at x = r
    if (th == 0)
        line([r r], [1 size(im,1)], 'Color', 'blue');
    else
        %// Compute starting y coordinate
        y0 = (-cosd(th)/sind(th))*x0 + (r / sind(th)); %// Note theta in degrees to respect your convention

        %// Compute ending y coordinate
        yend = (-cosd(th)/sind(th))*xend + (r / sind(th));

        %// Draw the line
        line([x0 xend], [y0 yend], 'Color', 'blue');
   end
end

. Чтобы нарисовать вертикальную линию, мне нужно знать, насколько высока изображение так что мы можем нарисовать вертикальную линию от вершины изображения (y = 1) до нижней части изображения (y = height), которая закреплена на x = rho. Таким образом, приведенный выше код теперь должен корректно обрабатывать любую строку, а также вырожденный случай, когда наклон бесконечен. Таким образом, эта вторая версия кода - это то, что вам нужно.


Удачи!

5
ответ дан Community 19 August 2018 в 14:52
поделиться
  • 1
    Итак, второй случай должен работать для всех строк, вертикальных, горизонтальных и других? – Chris Jones 5 February 2015 в 21:50
  • 2
  • 3
    Как вы можете видеть, изображение имеет отрицательный rhos .. Я также поставил некоторые неправильные углы тоже .. это действительно работали для не вертикальных линий, хотя. – Chris Jones 5 February 2015 в 22:04
  • 4
    @ChrisJones - Как вы получили отрицательный rho? Это происходит только в том случае, если ваше начало не находится в верхнем левом углу. Отрицательный rho невозможен, если ваше происхождение четко определено. – rayryeng 5 February 2015 в 22:06
  • 5
Другие вопросы по тегам:

Похожие вопросы: