2017-10-26 33 views
1

나는 "진짜"이미지 주위에 어떤 종류의 경계선이있는 서로 다른 이미지를 가지고 있습니다. 내가 성취하고자하는 것은 "진짜"이미지 (크기와 위치는 픽셀 단위)를 찾는 것입니다.이미지 내에서 이미지 찾기 (객체 감지)

real image showing water with shark

는 나에게 도전은 경계 (이 예에서는 상어와 함께 물)와 "진짜"이미지 (검은 색이나 소음이 많은 회색의 모든 종류의 수 있습니다) 항상 검은되지 않는 것입니다 색상, 채도, 색상의 조합을 가질 수 있습니다 ...

일반적으로 저는 Canny, Blob 감지, hough 선 등과 같은 알고리즘을 알고 있지만, 이제 막 사용하기 시작했습니다. 지금까지 특정 이미지의 테두리를 찾을 수 있었지만 같은 알고리즘과 매개 변수를 다음 이미지에 적용하자 마자 작동하지 않습니다. 나의 현재의 접근 방식은이 (의사 코드) 다음과 같습니다

  1. 변환이 CvInvoke.Canny(_processedImage, imgEdges, 60, 100)
  2. CvInvoke.Threshold(_processedImage, blackWhiteImage, _parameters.BinarizeThreshold, 255, CvEnum.ThresholdType.Binary)
  3. 감지 모서리 CvInvoke.GaussianBlur(_processedImage, bluredImage, New Drawing.Size(5, 5), 0)
  4. 치화와 CvInvoke.PyrDown(srcImage, targetImage)CvInvoke.PyrUp(srcImage, targetImage)
  5. 흐림 이미지 CvInvoke.CvtColor(_processedImage, tempMat, CvEnum.ColorConversion.Rgb2Gray)
  6. 다운 샘플링을 회색으로
  7. `CvInvoke.FindContours (_processedImage, contours, Nothing, CvE)로 윤곽선 찾기

있다고 가정

특히 적절한 매개 변수를 찾는 방법에 대한 힌트 모든 이미지에 대해) 적응 (adaptive) 임계 값 및 캐니 (canny) 알고리즘뿐만 아니라 처리 파이프 라인 개선을위한 아이디어도 높이 평가 될 것입니다.

답변

1

이 이미지에서 검은 이미지를 빼기를 시도 할 수 있습니다, 당신은 내부 이미지를 얻을 것이다, 방법은이 작업을 수행합니다 : 국경이 균일 인 경우 Use image subtraction to compare images in C#,

+0

아이디어와 링크를 제공해 주셔서 감사합니다. 이 사실을 정확히 이해합니까? 원본 이미지와 동일한 크기의 완전히 검은 색 이미지로 시작하여 원본 이미지를 검정색으로 빼십시오. 질문에서 언급했듯이 국경은 항상 검은 색이 아니라 회색의 종류입니다. 그래서 국경을 또 다른 회색으로 끝낼 것입니다, 맞습니까? 다음 문제는 내부 이미지의 좌표와 크기가 필요하다는 것입니다. 그렇게하는 방법? 초보자 질문에 대해 유감이지만,이 멍청이는 정말로 나에게 분명하지 않습니다. –

+1

완전히 검은 색 이미지를 빼는 것은 당연히 아무 작업이 아니지만 다른 것을 뺄 때는 유용 할 수 있습니다. BTW OpenCV에는 이미지 간의 절대 차이를 계산하고 최대 값을 찾는 기능이 내장되어 있습니다. – NickJH

1

것은,이 쉬울 것이다. cv::reduce을 사용하여 각 행과 열의 MIN과 MAX를 찾으십시오. MIN 및 MAX가 근처의 구석에있는 픽셀 값과 같거나 (또는 ​​매우 가까운) 위쪽, 왼쪽, 아래쪽, 오른쪽 행/열을 계산합니다. 온건함을 위해서, 아마 모든면에서 국경 색깔이 같은지 확인하십시오.

예를 들어 경계선이 희미한 빨강을 포함하지만 행/열 접근 방식은 문제를 단순화하는 데 여전히 유용한 방법 일 수 있습니다. 아마 Nofar가 시사하는 것처럼 배경색이라고 생각하는 것과 절대적인 차이를 보일 것입니다. 사각형으로 변환하고 회색으로 변환 한 다음 행과 열의 합계로 줄입니다. 그래도 가장자리를 찾아야하지만 2 차원에서 1 차원으로 데이터가 축소되었습니다.

큰 테두리와 많은 노이즈가있는 경우 반복 할 수 있습니다. 두 번째 패스에서 테두리를 구성한다고 생각되는 행을 열의 통계에서 제외합니다 (반대의 경우도 마찬가지 임).

편집 : 위의 직립 사각형에 대해서만 작동합니다! 회전 할 수있는 경우 행/열 투영 방법이 작동하지 않습니다. 그 경우 위와 같이 제곱의 차이를 구할 수 있습니다 (회색으로 변환하여 정보를 버릴 수 있음). 흐림 또는 일부 형태, 가장자리 감지, 일종의 하프 변환으로 직선 찾기 가장자리.

+0

좋은 아이디어! 감사. 사실 직사각형은 약간 회전합니다. 제곱의 차이의 합에 대해 조사했습니다. 그러나이 이미지를 단일 이미지에 사용하는 방법은 분명하지 않습니다. 전체 이미지의 특정 부분이 경계라고 가정 할 수 있습니다. 너가 말하는게 이거니? 아니면 더 세밀하게 생각하고 이미지의 특정 부분을 서로 비교하고 있습니까? –

+0

@Jan 글쎄, 완전한 해결책이 없지만 몇 가지 아이디어를 공헌하려고 노력했다. 결국 그것은 당신의 특정한 이미지 내용에 달려있을 것이다. 회전이 거의 없다면 여전히 행과 열을 잘라내는 것으로 시작할 수 있습니다. 항상 배경 인 모든 지역이 있습니까? 아니면 항상 어두운 배경입니까? 그렇지 않다면 배경과 같이 텍스처를 식별하는 다른 방법이 필요할 수 있습니다. (영화처럼 보입니다.이 경우 여러 프레임으로 무언가를 할 수도 있습니다 ...) – NickJH

+0

시간과 노력에 감사드립니다. 다음 주에 내 컴퓨터에 돌아 왔을 때 아이디어를 확인할 것입니다. –