Hough 변환 이해에 도움


19

MATLAB에서 Hough 변환을 사용하려고하는데 문제가 있습니다. 고정해야 할 피크를 감지하는 방법이 실제로 좋지 않지만 그 전에 선을 다시 올바르게 작성하기 위해 허프 변환을 되돌릴 수 있어야합니다. 이것은 내가 지금 얻는 물건의 유형입니다.

여기에 이미지 설명을 입력하십시오

90도 회전 한 것처럼 보이지만 왜 그런지 잘 모르겠습니다. 내 허프 공간이 잘못되었는지 또는 내가 허파하고 선을 그리는 방식인지 확실하지 않습니다. 또한 내 피크 감지를 개선하는 데 도움이 될 수 있습니까? 코드에 사용 된 이미지는 여기

%% load a sample image; convert to grayscale; convert to binary

%create 'x' image (works well)
a = eye(255);
b = flipud(eye(255));
x = a + b;
x(128,128) = 1;

%image = rgb2gray(imread('up.png')) < 255;
%image = rgb2gray(imread('hexagon.png')) < 255;
%image = rgb2gray(imread('traingle.png')) < 255;
%%% these work
%image = x;
%image = a;
image = b;    

%% set up variables for hough transform
theta_sample_frequency = 0.01;                                             
[x, y] = size(image);
rho_limit = norm([x y]);                                                
rho = (-rho_limit:1:rho_limit);
theta = (0:theta_sample_frequency:pi);
num_thetas = numel(theta);
num_rhos = numel(rho);
hough_space = zeros(num_rhos, num_thetas);

%% perform hough transform
for xi = 1:x
    for yj = 1:y
        if image(xi, yj) == 1 
            for theta_index = 1:num_thetas
                th = theta(theta_index);
                r  = xi * cos(th) + yj * sin(th);
                rho_index = round(r + num_rhos/2);                      
                hough_space(rho_index, theta_index) = ...
                     hough_space(rho_index, theta_index) + 1;
            end
        end
    end
end  

%% show hough transform
subplot(1,2,1);
imagesc(theta, rho, hough_space);
title('Hough Transform');
xlabel('Theta (radians)');
ylabel('Rho (pixels)');
colormap('gray');

%% detect peaks in hough transform
r = [];
c = [];
[max_in_col, row_number] = max(hough_space);
[rows, cols] = size(image);
difference = 25;
thresh = max(max(hough_space)) - difference;
for i = 1:size(max_in_col, 2)
   if max_in_col(i) > thresh
       c(end + 1) = i;
       r(end + 1) = row_number(i);
   end
end

%% plot all the detected peaks on hough transform image
hold on;
plot(theta(c), rho(r),'rx');
hold off;


%% plot the detected line superimposed on the original image
subplot(1,2,2)
imagesc(image);
colormap(gray);
hold on;

for i = 1:size(c,2)
    th = theta(c(i));
    rh = rho(r(i));
    m = -(cos(th)/sin(th));
    b = rh/sin(th);
    x = 1:cols;
    plot(x, m*x+b);
    hold on;
end

링크 : Hough 변환 된 이미지의 De-Houghing을 수행하는 방법


문제를 해결 했습니까? 비슷한 문제에 직면하고 있습니다. 감사합니다
Erez Posner

수프 matlab 쏟아져 장식 플러스 타원

답변:


11

첫째, Matlab에는 내장 된 Hough Transform이 있습니다.

[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);

이미지에 반드시 가장자리 감지가 필요하지는 않지만 처리 시간과 알고리즘을 사용하여 알고리즘의 효율성을 향상시킬 수 있습니다. 삼각형에는 흰색과 검은 색의 지방이 있습니다. 이상적으로 삼각형은 삼각형의 가장자리를 표시하는 두께가 1px입니다. Canny Edge Detection 사용

BW = edge(Image,'canny');

90<θ<900<θ<1800<θ<π90π/2

어큐뮬레이터 매트릭스에서 더 클 수있는 주변 피크가 있기 때문에 잘못된 피크를 선택할 가능성이 있습니다. 여기에 많은 알고리즘이 있지만 과거에 Hough Transforms에서 사용한 알고리즘이 있습니다.

1) Define a region shape (typically its square) 
2) Define an accumulator threshold  
3) Select one pixel in the accumulator matrix
4) If it is a peak (i.e., larger than neighboring values above a threshold)
       a) look at the points within the region shape.
       b) If there is a larger value
              this is not a peak
          Else
              this is a peak
 5) Move to next pixel in accumulator matrix.

허프 변환 선, 결과를 표시하려면 허프 라인을 살펴보십시오.

http://www.mathworks.com/help/toolbox/images/ref/houghlines.html

Canny Edge Detector 사용의 효과

가장자리 감지는 삼각형의 각면을 두 개의 선으로 바꿀 수 있습니다.

캐니 에지 감지의 목표는 최대 억제 를 사용하여 최대한 얇고 좁은 에지를 생성하는 것입니다.

간단히 말해서 캐니 에지 감지 (출처 : Digital Image Processing, Gonazalez)

1) Smooth input Image using a Gaussian Filter
2) Compute the Gradient magnitude and angle (Sobel, Perwitt or robert cross filters)
3) Apply Nonmaxima suppression (this is where the thinning happens) 
   a) Figure out which direction the edge is
   b) If the edge's magnitude is smaller than one of its two neighbors in the direction of the edge
          set the edge point to zero
      Else
          leave it alone
4) Use double thresholding and connectivity analysis to detect and link edges

답장을 보내 주셔서 감사합니다. 나는 그것을 더 잘 이해하기 위해 처음부터하고 있습니다. 캐니 가장자리 감지는 여전히 2 개의 삼각형을 제공합니다. 하나는 안쪽 가장자리를위한 것이고 바깥 쪽 가장자리를위한 것입니다. 나는 wikipedia에서 theta가 0 : pi라는 이론을 배웠습니다. 내장 함수는 -pi / 2 : pi / 2를 사용하지만 실제로 차이가 없어야한다는 것을 알고 있습니다.
waspinator

방망이에서 바로 레인지에 차이가 없어야합니다. (180도 회전 한 선의 차이를 알 수 있습니까?) 그러나 이미지 보정 알고리즘에 허프 변환을 사용하는 경우 차이가 발생합니다. (오른쪽
위아래

가장자리 감지로 1 줄만 찾으려면 2 줄을 생성하지 않습니까? 두꺼운 선의 중심을 찾는 것이 더 좋습니다.
endolith

@endolith 원래 게시물에서 가장자리 감지에 대한 약간의 토론을 포함
CyberMen

'바퀴를 재발 명할 필요가 없습니다'? 내 강사에게 말하십시오 ;-)
Nathan Schwermann

3
    if image(xi, yj) == 1 

로 변경해야합니다

    if image(yj, xi) == 1 

라인이 dehough에서 작동하기 위해


1

3 개의 루프를 사용하는 답은 최적이 아니며 개선 될 수 있습니다. 여기에는보다 직관적 인 접근 방식 / 관점이 있습니다.

유효한 모든 점 쌍은 고유 한 a & b of를 설정합니다 y = ax + b. 라인은 동일한 a & b 값을 가진 많은 쌍을 가지므로 긴 라인은 피크로 나타납니다. 극좌표 r 및 teta 좌표에서도 마찬가지입니다.

각 점을 개별적으로 처리하는 대신 점 쌍을 사용하십시오. 모든 (보통 스파 스) 포인트를 별도의 목록에 저장할 수 있다면 더 좋지만 반드시 필요한 것은 아닙니다.

  1. 각 쌍을 가지고 그것의 a & b를 계산하십시오. (이산 값으로 반올림)
  2. 배열의 특정 위치로 이동하여 1을 추가하십시오.

긴 줄-> 같은 a, b를 가진 많은 쌍.
산발적 인 점-> 특정 세포에서 적은 수의 계산-> 더 혼란 스럽습니다.


그것을 보는 또 다른 방법은 라돈 / 투영 관점에서입니다.

  • 라인은 수직 "수집 라인"에 강력하게 투영되므로 점수가 높습니다.
  • 라인과 "수집 라인"사이의 각도가 90 도가 아니거나 수집 라인이이 "수집 라인"에 투영 된 모든 라인 포인트를 수집하지 않으면, 더 낮은 점수가있을 것이다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.