이미지에서 사각형 찾기


34

OpenCV를 사용하여 이미지에서 사각형을 찾아야합니다 (matlab 또는 다른 문제, 일반적으로 내가 생각하는 것은 아이디어입니다).

아래 테스트 이미지를 고려하십시오.

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

위의 이미지에서 색상이 지정된 사각형을 정확하게 찾아야합니다 (흰색 긴 스트립이 아님).

내가 뭘 한거지 :

  • 일반적인 방법 (OpenCV 샘플과 함께 제공됨)을 적용했습니다. 즉, 모든 색상 평면에서 윤곽선찾고 근사하고 요소 수 = 4를 확인합니다. 그것은 약간의 사각형, 특히 어두운 사각형이 감지되도록 확장합니다.

  • 다음 단계는 예측 이었습니다 . 즉 이 배열은 고정되어있다 . 따라서 일부를 얻으면 나머지를 예측할 수 있습니다. 또한 약간 더 확장되었습니다. 그러나 정확도는 매우 나빴습니다.

그러나 나는 여기서 예측이 좋은 방법이 아니며 첫 번째 단계에서 주어진 정확한 답변을 항상 제공하지는 않는다고 생각합니다.

내가 필요한 것 :

1)이 사각형을보다 정확하게 감지하는 다른 더 좋은 방법이 있습니까? 아니면 여러 방법?

한 가지 중요한 점은 시간이 문제가되지 않는다는 것 입니다. 알고리즘이 느려질 수 있지만 중요하지 않습니다. 그러나 정확성이 주요 기준입니다.

때로는 이미지가 훨씬 흐려질 수 있습니다.

그리고 내가 직면 한 주요 문제 중 하나는 일부 사각형의 배경색이 거의 비슷하다는 것입니다 (열 3의 첫 번째 및 두 번째 사각형 확인).

아이디어를 찾고, 미리 감사드립니다.

업데이트 :

아래는 내가 얻은 최대 정확한 결과입니다.

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

물론 결과 이미지의 크기는 약간 조정됩니다.

업데이트 2 :

아래 답변에 훨씬 더 나은 해결책을 제시했습니다 : https://dsp.stackexchange.com/a/7526/818


당신의 배경은 항상 흰색입니까?

1
내 생각은 "채도"를 계산하고 sat img를 임계 값으로 설정했지만 예제를 사용하면 잘 작동하지 않습니다 (채도를 max (RG, RB, GB)로 계산). 정사각형의 일부는 배경처럼 보입니다. 모든 이미지가 같은 패턴 (옆에 사각형이있는 긴 흰색 줄무늬)이있는 경우 가장 쉬운 비트 (예 : 실제로 색이 지정된 사각형 또는 흰색 줄무늬)를 찾는 것이 다른 위치에 대한 가능한 위치를 추론하는 것을 고려해야합니다 사각형 및 ... 그들은 정말이 또는 not.Tough하지만 흥미로운 당신이 더 많은 이미지를 줄 수 있는지 확인하는 방법 찾아라!는?

글쎄, 나는 이것을 옮겨서는 안된다고 생각합니다.
Junuxx

1
더 많은 이미지를 제공 할 수 있습니까? 또이게 뭐야?
Andrey Rubshtein

2
OP는 몇 가지 질문에 대답해야합니다. 흰색 배경이 필요하지 않을 수 있습니다. 그리고 무슨 일이야? 그렇게 나빠질까요? 이것들은 나에게 불필요한 복잡해 보입니다.
태 성 신

답변:


9

Matlab을 사용한 첫 번째 시도 :

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

다음과 같은 지역이 있습니다.

라벨이 지정된 지역

보다시피, 가장 많은 수의 영역 (T = 120)을 초래하는 임계 값을 선택하면 이미 7 개의 올바른 위치, 일부 병합 된 위치, 1 개의 오 탐지 및 2 개의 오 탐지가 표시됩니다.

이것은 매우 간단한 시도 였지만 접근 방식이 효과적이라는 것을 보여줍니다. 길쭉한 영역을 나누기 위해 몇 가지 물건을 추가하거나 각 색상 채널에 대해 별도로이 작업을 수행하면 개선 할 수있는 몇 가지 일이 있습니다.

테스트 이미지를 몇 개 더 제공하면 도움이됩니다.


8

문제의 결과를 개선하기 위해 다른 것을 시도했습니다. 아래 솔루션은 첫 번째 사각형 (주황색)이 항상 1 단계에서 감지된다는 가정하에 있습니다. 그리고 배경에 비해 높은 대비 색상으로 인해 실용적입니다. 문제의 결과조차도 올바르게 감지했습니다.

1 단계 : 가능한 많은 사각형 찾기

이미지를 R, G, B, H, S, V 평면으로 분할하고 25의 배수와 같은 다른 임계 값에 대해 이미지의 임계 값을 설정했습니다. 각 이미지에 대해 사각형을 찾아 "마스크 이미지" 에 넣었습니다 . 나는 또한 사각형의 평균 높이와 너비를 발견했습니다.

마스크 이미지 (총 7/12 제곱 감지) :

마스크 이미지

2 단계 : 사각형 격자 형성

다음으로 마스크 이미지에서이 사각형의 중심을 찾았습니다. 그들을 정렬하고 첫 번째 사각형 (주황색)의 중심을 찾았습니다. 면밀한 분석을 통해 두 사각형 사이의 간격이 가로 및 세로 방향의 사각형임을 알 수 있습니다. 따라서이 방법으로 아래와 같은 사각형 격자를 만들고 ideal_squares 라고 불렀습니다 (이름 일뿐입니다. 필요한 결과가 아닙니다).

ideal_squares :

이상적인 이미지

3 단계 : ideal_image를 다시 매핑

이제 ideal_squares 중심과 원래 중심이 있습니다. ideal_centroids에서 각 원래 중심에 대한 정확한 일치를 찾았습니다 (유클리드 거리 사이에 있음). 그럼 난 보간 Scipy의 interpolate.griddata을 사용하고 중심 값에 따라 ideal_image를 매핑 (가 이루어 일그러짐과 거의 동일이 Q & A : 스도쿠 광장에 볼록 결함을 제거하는 방법OpenCV의에서 이미지 변환 ). 아래는 내가 얻은 출력입니다.

출력 :

출력 이미지

4 단계 : 또는 첫 번째 단계의 마스크 이미지로 위의 출력을 작동

최종 출력

이제 모든 사각형이 감지되었지만 아래에 언급 된 문제가 있음을 알 수 있습니다.

문제 :

3 단계의 출력, 즉 사각형 격자의 재 맵핑 된 이미지를보십시오. 두 개의 중앙 사각형을 제외하고 다른 모든 사각형은 잘립니다. 이 리매핑과 관련된 문제입니다. scipy.interpolate.griddata () 또는 cv2.remap ()으로 문제가 어디에 있는지 잘 모르겠습니다. 나는 전체 이미지가 뒤 틀릴 것이라고 생각했지만 그렇지 않습니다. 우리가 준 중심 내부의 이미지 만 왜곡시킵니다. 이를 정정 할 수 있으면 출력은 정상입니다.

누군가가 그것에 대해 좋은 아이디어를 알고 있다면, 가장 환영합니다!


5

참고 :이 방법은 실제로 느릴 것입니다.

이상적인 물체의 윤곽처럼 보이는 마스크를 생성하십시오. 이것과 비슷합니다 :

객체의 마스크

그런 다음 이미지 위로 마스크를 슬라이드 (위치, 스케일, 회전)하고 실제 이미지의 윤곽선과 일치시켜 (부드럽게 반응하기 위해 약간 흐리게 함) (포지션, 스케일, 회전) 가장 높은 유사성 응답은 실제 객체의 (위치, 스케일, 회전)이어야합니다.

이 방법은 전체 객체를 고려하기 때문에 사각형을 객체의 배경 또는 부분 폐색으로 혼합하는 것을 신경 쓰지 않습니다.

나는 개인적으로 마우스 주둥이와 수염을 추적하기 위해이 방법을 성공적으로 사용했지만 마지막으로 알려진 위치에 가까운 것과 같은 추정이 있었지만 다음과 같은 가정을 적용하여 검색 공간을 줄일 수 있다고 생각합니다. 가능한 크기 카메라에있는 물체의 중심으로부터 얼마나 멀리 떨어져 있는지 또는 회전 <10도 등


5

1 단계 : B, G, R, H, S, V 평면에서 분석하여 얻은 최종 이진 이미지가 무엇이든, 해당 이미지의 블롭 카운팅 알고리즘을 수행합니다.

2 단계 : 면적 또는 윤곽 길이를 기준으로 가장 큰 얼룩을 찾습니다. Blob은 대부분 평행 사변형 유형이므로 면적 또는 윤곽이 될 것입니다.

3 단계 : 가장 큰 얼룩으로 (가장 큰 얼룩은 실제 사각형과 가장 유사한 얼룩이므로) 얼룩의 방향을 찾으십시오 ... 이것은 가장 잘 맞는 사각형을 피팅하여 얻을 수 있거나 모퉁이 점을 얻을 수 있습니다 ... 선을 연결하는 선의 기울기를 수평선과 수직 방향으로 가져옵니다.

4 단계 : 두 개의 경사가 생기면 블롭의 축을 통과하는 두 개의 선을 그립니다. 축의 경우 모서리 점의 평균을 구하거나 중심 (질량 중심)을 사용할 수 있습니다 ... 모퉁이 점의 평균으로 갈 것입니다 ...

5 단계 : 각 수평 및 수직 방향에서 간격이 같기 때문에 (이상적인 정사각형 그림에서 나오는 것과 수평 및 수직 간격도 동일하지만 가정하지는 않습니다.) 가능한 한 다른 중심을 찾습니다. 평행 사변형

하단 라인 : 하나의 사각형이 완벽하게 감지되면 전체 그리드를 만들 수 있습니다. 가장 큰 얼룩의 가로 축을 따라 2H 간격 (H = 가장 큰 얼룩의 가로 너비)과 얼룩의 세로 축을 따라 세로로 2V (V = 가장 큰 얼룩의 세로 높이) 간격으로 마킹 센터를 유지하십시오.

일부 사진 지원 여기에 이미지 설명을 입력하십시오

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


1
+1-구현할 수 있다면 좋을 것입니다.
Abid Rahman K

2
@AbidRahmanK 그것은 StackExchange가 아닙니다. 질문-> 답변. 그렇지 않으면 이것은 직업 박람회가 될 것입니다.
Jan Krüger

2

이 배치는 고정되어 있습니다

나는 당신이 전에 어떤 종류의 예측을했는지 알지 못하지만 흰색 긴 줄에 뿌리를 맞추려고 노력 했습니까? 그런 다음 (3 열의 제곱이 같은 크기 인 경우) 사각형의 높이 (두 스트립 사이의 거리)를 감지하고 이미지에서 최대 및 최소 영역 (높이 및 너비)을 감지 할 수 있습니다.

그런 다음 전체 정사각형에서 가장 일반적인 색을 감지하여 "정사각형이 아닌"영역으로 설정하십시오. 나머지는 당신이 찾고있는 사각형이어야합니다.


윤곽 법을 사용하여 3-4 정사각형을 찾았습니다. 그런 다음 각 사각형의 높이와 너비를 얻었습니다. 그런 다음 감지 된 사각형 사이의 간격을 확인하고 두 사각형 사이의 간격이 다른 사각형을 보유하기에 충분히 큰지 가정합니다. 그것이 내가 만든 예측입니다.
Abid Rahman K

일부 사각형은 배경색과 거의 비슷한 색상입니다. 그래서 두렵습니다. 귀하의 방법에 따라 사각형이 아닌 영역으로 간주됩니다.
Abid Rahman K

어쩌면 모든 열에 대해 작업하여 이미지에서 x 축이 높이 (픽셀)이고 y 축이 강도 인 곡선을 그릴 수 있습니다. 그런 다음 미분 형태로 일부 최첨단을 찾을 수 있습니다.

그것은 가장자리 감지 그 자체입니까? 나는 그것을 시도했지만 좋은 결과를 얻지 못했습니다.
Abid Rahman K

1
그렇습니다.하지만 실패한 이유를 직접보고 플롯에서 흥미로운 부분을 분리 할 수 ​​있습니다. 그런데 문제를 해결하는 데 도움이되는 팁을 찾으면 게시하십시오. 당신의 연구를위한 행운을 빕니다

0

선, 원 등 간단한 파라 메트릭 형태를 찾기위한 매우 강력한 알고리즘 인 Hough 변환을 사용하는 것이 좋습니다. 선 감지가 가장 좋습니다. 길고 하얀 스립의 측면을 최소한 찾을 수 있습니다. 그런 다음 모서리 추출기 알고리즘 (Harris 또는 SIFT 또는 SURF)을 사용하면 사각형이 거의 같은 간격으로 있다는 사실을 사용하여 해당 선을 따라 모서리를 찾을 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.