2017-02-11 4 views
3

잡음이있는 이미지 행렬에서 직사각형을 자동 감지하려고합니다. 값은 2 진수이며 임의의 수의 직사각형이 있습니다. 가장자리는 노이즈로 인해 약간 퍼지 수 있습니다. 나는 직사각형의 좌표 또는 그와 같은 다른 방법으로 그 영역에 집중할 수있게하고 싶습니다.R에서 컴퓨터 비전을 사용하여 잡음이 많은 데이터에서 사각형 찾기

나는 PET 패키지에서 Hough 변환을 시도했지만 출력 해석 방법을 이해하지 못했습니다. 나는 다른 패키지 또는 기술에 열려 있습니다.

library(PET) 

AddRectangle<- function(df, startx, starty, cols, rows){ 
    RectangleVector <- rep(1:cols, times = rows) 
    #Start Point 
    RectangleVector <- ncol(df)*(starty-1) + (startx-1) + RectangleVector 
    #Row changes 
    RectangleVector<- RectangleVector+ rep((0:(rows-1))*ncol(df), each = cols) 
    RectangleVector 
} 

#create matrix, this is an arbitrary example. 
dfrows <- 100 
dfcols <- 100 
df <- matrix(0, nrow = dfrows, ncol = dfcols) 

#put in rectangles 
df[AddRectangle(df, startx = 3, starty = 3, cols = 10, rows =10)] <-1 
df[AddRectangle(df, startx = 40, starty = 50, cols = 30, rows =20)] <-1 
df[AddRectangle(df, startx = 45, starty = 10, cols = 30, rows =35)] <-1 
df[AddRectangle(df, startx = 80, starty = 80, cols = 10, rows =10)] <-1 

image(df,col = grey(seq(0, 1, length = 2))) 

set.seed(2017) 
#add in noise 
noisydf<- df 
#Positives 
noisydf[runif(dfrows*dfcols)>0.97]<-1 
#negatives 
noisydf[runif(dfrows*dfcols)>0.97]<-0 

#Visualise 
image(noisydf,col = grey(seq(0, 1, length = 2))) 

이 코드는 다음 이미지를 만듭니다.

The noisy rectangles generated by the above example

내가 아주 좋은 사진을 얻을 수 있지만, 그것으로 무엇을 해야할지 모르겠어요 애완 동물 패키지를 사용. 우리가 얻고 자하는 것은 직사각형의 좌표와 같은 것입니다. 나는 Hough 변환에 묶여 있지 않으며 어떤 성공적인 방법도 좋습니다. 무료로 - 아무도 당신을 응답 할 것 같다으로

test <- hough(noisydf) 

image(test$hData) 
+0

시작 이미지가 유용 할 것입니다. –

+0

주어진 코드는 표시된 이미지를 생성합니다. 시끄러운 이진 행렬에서 사각형을 찾는 일반적인 방법을 찾고 있으므로 특정 이미지가 없으므로 클래스 행렬의 객체를보고 있기 때문에 이미지 형식이 없습니다. 이미지를 구체적으로 요구하는 이유가 있습니까? 나는 정보가 누락되면 명확하게하려고 노력할 것이다. 유용한 정보를 놓친다면 사과하는 이미지 처리가 처음이에요. –

+0

그러면 표시된 이미지에서 계속해서 사각형을 찾으시겠습니까? 그렇다면'cv :: connectedComponents'가 필요하다고 생각한 다음 작은 얼룩을 제외시킬 최소 영역을 설정하십시오. –

답변

1

는, 어쩌면 당신은 대부분의 리눅스 배포판에 설치 맥 OS와 Windows 용 사용할 수 있습니다 ImageMagick를를 사용하여 대체 솔루션에 열려 있습니다.

그래서, 최소 면적 모양 또는 연결된 구성 요소의 덩어리를 식별하기 위해 단지 명령 줄에서 "연결됨 성분 분석"을 사용하고 있습니다. 나는 4 연결된 형태 (사각형)보다는 8 연결된 모양을 지정하고 - 동북, 동남, 남서와 북서 위치에 흰색 픽셀을 수 있도록 고려해야 할 이웃 :

convert rectangles.png -threshold 50%    \ 
    -define connected-components:verbose=true  \ 
    -define connected-components:area-threshold=1000 \ 
    -connected-components 4 -auto-level z.png 

출력

Objects (id: bounding-box centroid area mean-color): 
    0: 613x460+0+0 287.2,239.0 140894 srgb(255,255,255) 
    3: 504x294+69+78 318.1,213.1 115208 srgb(0,0,0) 
    168: 153x102+291+237 369.5,286.5 14800 srgb(255,255,255) 
    100: 154x59+266+164 344.6,194.5 8334 srgb(255,255,255) 
    265: 54x28+84+328 112.5,341.7 1372 srgb(255,255,255) 
    41: 49x31+469+110 492.8,123.5 1372 srgb(255,255,255) 

출력의 첫 번째 줄에있는 열 제목을보고 희망 당신은 6 직사각형 확인했습니다 볼 수 있습니다 - 지난 4 즉 rgb(255,255,255), 흰색이며, 당신의 사각형에 해당합니다. 168:...을 시작하는 것을 살펴 보겠습니다. 너비는 가로 153 픽셀, 세로 102 픽셀이며 이미지의 왼쪽부터 291 픽셀, 이미지의 위쪽에서 237 픽셀을 시작합니다. 그 마지막 사에 따라서,하자 색상 :

convert rectangles.png -fill "rgba(255,0,0,0.5)" -draw "rectangle 291,237 444,339" \ 
    -fill "rgba(0,0,255,0.5)" -draw "rectangle 266,164 420,224" \ 
    -fill "rgba(255,0,255,0.5" -draw "rectangle 84,328 138,356" \ 
    -fill "rgba(0,255,255,0.5)" -draw "rectangle 469,110 518,141" result.png 

enter image description here

당신은 cv::connectedComponents를 사용 OpenCV의로 물건의 같은 종류의 작업을 수행 할 수 있습니다.

+0

고맙습니다. 정말 멋지고 흥미 롭습니다. 불행하게도 R 워크 플로우에 적합해야하지만 Opencv를 사용하거나 함수가 어떻게 작동하는지 볼 수 있으므로 R과 비슷한 것을 구현할 수 있습니다.그런 생각을 해줘서 고마워. –