이미지에서 대칭 영역 / 패턴 찾기


14

인간 후면의 평균 곡률을 나타내는 이미지 세트가 있습니다.

내가하고 싶은 것은 이미지의 다른 부분에 유사하고 반사 된 "카운터 파트"가있는 점을 이미지를 "스캔"하는 것입니다 (가장 중간 선에 대칭 일 가능성이 있지만 반드시 변형이있을 수는 없습니다). 일부 이미지 스티칭 기술은 이것을 사용하여 이미지 사이의 유사한 점을 "자동 감지"하지만 동일한 이미지의 양면에서이를 감지하고 싶습니다.

궁극적 인 목표는 등을 대칭적인 "반쪽"으로 적응 적으로 나누는 연속적이고, 아마도 구부러진 세로선을 찾는 것입니다.

샘플 이미지가 아래에 배치됩니다. 모든 영역이 대칭 적이지는 않습니다 (특히 이미지 중앙 바로 위의 빨간색 세로 "스트립"이 오른쪽으로 벗어남). 그 지역은 나쁜 점수 또는 그 밖의 어떤 것을 받아야하지만, 로컬 대칭은 멀리 떨어진 대칭 지점에서 정의됩니다. 어쨌든, 응용 프로그램 도메인에 알고리즘을 적용해야하지만, 내가 추구하는 것은 som correlation / convolution / pattern-matching 전략이며, 이미 무언가가 있어야한다고 생각합니다.

(편집 : 아래에 더 많은 이미지가 있으며 설명이 더 있습니다)

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

편집 : 요청에 따라 잘 작동하고 문제가있는보다 일반적인 이미지를 포함시킵니다. 그러나 컬러 맵 이미지 대신 회색조 이미지이므로 컬러는 데이터 크기와 직접 관련이 있으며 컬러 이미지에서는 발생하지 않았습니다 (통신에만 제공). 회색 이미지는 컬러 이미지에 비해 대비가 부족한 것처럼 보이지만 데이터 그라디언트가 있으며 원하는 경우 적응 형 대비를 얻을 수 있습니다.


1) 매우 대칭적인 피사체의 이미지 :

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


2) 다른 순간에 같은 피사체의 이미지. 더 많은 "기능"(더 많은 그라디언트)이 있지만 이전과 같이 너무 대칭 적이지는 않습니다.

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


3) 더 흔하고 오목한 중간 선 대신 중간 선에 볼록 함 (가벼운 영역으로 표시되는 뼈 돌출부)이있는 얇은 젊은 대상체 :

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


4) X-Ray에 의해 확인 된 척추 편차를 가진 젊은이 (비대칭에 주목) :

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


5) 전형적인 "기울어 진"피사체 (곡선 된 중간 선을 중심으로 대칭이되고 적절하게 "변형되지 않음") :

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


어떤 도움이라도 대단히 환영합니다!


왜 척추를 분배기로 사용하지 않습니까?
Jim Clay

@JimClay : 척추가 나머지 이미지의 실제 대칭 축을 기준으로 측정되는 부분이라고 생각합니다.
endolith

"일부 이미지 스티칭 기술은이를 사용하여 이미지 사이의 유사한 점을"자동 감지 "합니다."이미지를 뒤집어 복사 한 다음 그 중 하나를 사용합니다. :)
endolith

단순히 Y 축을 따라 이미지를 미러링하고 등록 알고리즘을 사용할 수 없습니까? 융통성있는 / 비모수 적 등록 알고리즘에 대한 많은 연구가 이미 있기 때문에 구축 할 수 있습니다.
Niki Estner

JimClay, 척추는 내가 찾고 싶은 것입니다. 어디가 있는지 모르겠습니다. Endolith, 내 질문은 사람들이 저에게 그 알고리즘 중 일부의 이름을 알려주는 것입니다. 아직 찾지 못했습니다. 그리고 Nikie, 그것은 요점입니다. 그러나 나는 그 알고리즘들 중 어느 것도 모릅니다. 그래서 나는 처음에 질문을하는 이유입니다 : o)
heltonbiker

답변:


9

의견에서 말했듯이 의료 이미지 등록은 많은 연구가 가능한 주제이며 전문가는 아닙니다. 내가 읽은 것에서 일반적으로 사용되는 기본 아이디어는 두 이미지 (당신의 경우 이미지와 미러 이미지) 사이의 매핑을 정의 한 다음 매핑이 적용되면 매끄러움과 이미지 유사성에 대한 에너지 용어를 정의하고 마지막으로 표준 (또는 경우에 따라 응용 프로그램 별) 최적화 기술을 사용하여이 매핑을 최적화합니다.

Mathematica에서 빠른 알고리즘을 해킹하여 이것을 보여줍니다. 입니다 하지 당신이 의료 응용 프로그램에서 사용해야하는 알고리즘, 기본적인 아이디어의 데모.

먼저 이미지를로드하고 미러링 하고이 이미지를 작은 블록으로 나눕니다.

src = ColorConvert[Import["http://i.stack.imgur.com/jf709.jpg"], 
   "Grayscale"];
mirror = ImageReflect[src, Left -> Right];
blockSize = 30;
partsS = ImagePartition[src, {blockSize, blockSize}];
partsM = ImagePartition[mirror, {blockSize, blockSize}];
GraphicsGrid[partsS]

Mathematica 그래픽

일반적으로 키포인트 나 이미지 모멘트 등을 사용하여 대략적인 고정 등록을 수행하지만 이미지가 거의 중앙에 있으므로 생략합니다.

하나의 블록을보고 미러 이미지 대응 인 경우 :

{partsS[[6, 10]], partsM[[6, 10]]}

Mathematica 그래픽

그것들은 비슷하지만 바뀌 었다는 것을 알 수 있습니다. 변화의 양과 방향은 우리가 찾으려고하는 것입니다.

일치 유사성을 정량화하기 위해 제곱 유클리드 거리를 사용할 수 있습니다.

ListPlot3D[
  ImageData[
   ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
    SquaredEuclideanDistance]]]

Mathematica 그래픽

슬프게도,이 데이터를 사용하면 최적화가 생각보다 직접적으로 어려웠으므로 대신 2 차 근사를 사용했습니다.

fitTerms = {1, x, x^2, y, y^2, x*y};

fit = Fit[
   Flatten[MapIndexed[{#2[[1]] - blockSize/2, #2[[2]] - 
        blockSize/2, #1} &, 
     ImageData[
      ImageCorrelate[partsM[[6, 10]], partsS[[6, 10]], 
       SquaredEuclideanDistance]], {2}], 1], fitTerms, {x, y}];

Plot3D[fit, {x, -25, 25}, {y, -25, 25}]

Mathematica 그래픽

이 함수는 실제 상관 함수와 같지 않지만 첫 번째 단계에 충분합니다. 모든 블록 쌍에 대해 이것을 계산해 봅시다 :

distancesFit = MapThread[
   Function[{part, template},
    Fit[Flatten[
      MapIndexed[{#2[[2]] - blockSize/2, #2[[1]] - blockSize/2, #1} &,
        ImageData[
        ImageCorrelate[part, template, 
         SquaredEuclideanDistance]], {2}], 1], 
     fitTerms, {x, y}]], {partsM, partsS}, 2];

이는 최적화를위한 첫 번째 에너지 용어를 제공합니다.

variablesX = Array[dx, Dimensions[partsS]];
variablesY = Array[dy, Dimensions[partsS]];

matchEnergyFit = 
  Total[MapThread[#1 /. {x -> #2, y -> #3} &, {distancesFit, 
     variablesX, variablesY}, 2], 3];

variablesX/Y는 각 블록에 대한 오프셋을 포함하고 오프셋이 matchEnergyFit적용된 원본 이미지와 미러 이미지 사이의 제곱 유클리드 차이를 근사합니다.

이 에너지 만 최적화하면 결과가 수렴되지 않을 수 있습니다. 또한 블록 유사성이 오프셋에 대해 아무 것도 알려주지 않는 오프셋이 매끄 럽기를 원합니다 (예 : 직선 또는 흰색 배경).

평활도를위한 두 번째 에너지 용어를 설정했습니다.

smoothnessEnergy = Total[Flatten[
    {
     Table[
      variablesX[[i, j - 1]] - 2 variablesX[[i, j]] + 
       variablesX[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesX[[i - 1, j]] - 2 variablesX[[i, j]] + 
       variablesX[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}],
     Table[
      variablesY[[i, j - 1]] - 2 variablesY[[i, j]] + 
       variablesY[[i, j + 1]], {i, 1, Length[partsS]}, {j, 2, 
       Length[partsS[[1]]] - 1}],
     Table[
      variablesY[[i - 1, j]] - 2 variablesY[[i, j]] + 
       variablesY[[i + 1, j]], {i, 2, Length[partsS] - 1}, {j, 1, 
       Length[partsS[[1]]]}]
     }^2]];

다행히 Mathematica에는 제약 최적화가 내장되어 있습니다.

allVariables = Flatten[{variablesX, variablesY}];
constraints = -blockSize/3. < # < blockSize/3. & /@ allVariables;
initialValues = {#, 0} & /@ allVariables;
solution = 
  FindMinimum[{matchEnergyFit + 0.1 smoothnessEnergy, constraints}, 
   initialValues];

결과를 보자.

grid = Table[{(j - 0.5)*blockSize - dx[i, j], (i - 0.5)*blockSize - 
      dy[i, j]}, {i, Length[partsS]}, {j, Length[partsS[[1]]]}] /. 
   solution[[2]];
Show[src, Graphics[
  {Red,
   Line /@ grid,
   Line /@ Transpose[grid]
   }]]

Mathematica 그래픽

0.1요인은 전에 smoothnessEnergy부드러움 에너지가 이미지 일치 에너지 용어와 관련하여 얻는 상대적 무게입니다. 다음은 서로 다른 가중치에 대한 결과입니다.

Mathematica 그래픽

가능한 개선 사항 :

  • 내가 말했듯이 먼저 엄격한 등록을 수행하십시오. 흰색 배경에서는 간단한 이미지 모멘트 기반 등록이 제대로 작동합니다.
  • 이것은 한 단계 일뿐입니다. 한 단계에서 찾은 오프셋을 사용하고 두 번째 단계에서이를 개선 할 수 있습니다 (아마도 더 작은 검색 창 또는 더 작은 블록 크기).
  • 블록 없이이 작업을 수행하는 기사를 읽었지만 픽셀 당 오프셋을 최적화합니다.
  • 다른 평활도 기능을 사용해보십시오

재미로 읽는 데 시간이 너무 오래 대답하지만, 최종 이미지는 꽤 나타낸다 : 그것은 놀랍다 : D
페넬로페

이 답변은 매우 깨달았습니다. 그것을 삼킬 시간이 필요하지만, 아마도 강성이 아닌 등록 기술이 내가 사용해야 할 것입니다. 운 좋게도 개념적인 세부 사항을 제공했기 때문에 최악의 경우 비슷한 접근법을 알아낼 수 있습니다. 그동안 더 많은 이미지로 질문을 업데이트하겠습니다. 고마워요!
heltonbiker

4

흥미로운 질문입니다. 우선, 관심 키포인트 감지기 및 일치를 기반으로 한 접근 방식을 따르는 것일 수 있습니다. 여기에는 SIFT (Scale-Invariant Feature Transform), SURF, ORB 등이 포함됩니다. 또는 Harris 연산자 (csce.uark.edu/~jgauch/library/Features/Harris.1988.pdf에만 기반한보다 간단한 접근 방식도 포함됩니다. ). 귀하의 게시물에서 당신이 시도한 것이 분명하지 않으므로 여기에 순진한 경우 죄송합니다.

즉, 재미를 위해 수학 형태론 (MM)을 사용하여 더 간단한 접근 방식을 취하겠습니다. :) 모든 단계를 시각화하기위한 이미지가 끝났습니다.

샘플 이미지를 가져 와서 ImageMagick을 사용하여 L a b * 색 공간으로 변환 하고 L * 밴드 만 사용했습니다.

convert x.jpg -colorspace Lab -separate %d.png

0.png는 L * 대역에 해당합니다. 이제 실제 이미지 데이터가 있다고 확신하지만 jpg 압축 아티팩트와 그렇지 않은 것을 처리하고 있습니다. 이 문제를 부분적으로 처리하기 위해 형태 5를 평평한 디스크 디스크로 형태 적 폐쇄를 수행 한 다음 MM을 사용하여 노이즈를 줄이는 기본 방법이며 디스크 반경을 고려할 때 이미지의 대부분이 변경되지 않았습니다. 다음으로 내 아이디어는이 단일 이미지를 기반으로했으며 다른 경우에는 실패 할 가능성이 큽니다. 관심있는 지역은 더 어두워서 (컬러 이미지에서 "호터") 시각적으로 구분되므로 통계 기반 이진화 기가 제대로 작동 할 수 있다고 가정했습니다. 나는 자동 접근 방식 인 Otsu의 접근 방식을 사용했습니다.

이 시점에서 관심있는 중심 영역을 명확하게 시각화 할 수 있습니다. 문제는 내 접근 방식에서 닫힌 구성 요소가되기를 원했지만 그렇지 않다는 것입니다. 가장 큰 구성 요소보다 작은 연결된 모든 구성 요소를 폐기하는 것으로 시작합니다 (배경을 구성 요소 중 하나로 간주하지 않음). 이진화 결과가 좋은 경우 다른 경우에는 효과가 더 큽니다. 예제 이미지에는 배경에 연결된 하나의 구성 요소가 있으므로 버리지 않지만 문제를 일으키지 않습니다.

당신이 여전히 나를 따르고 있다면, 우리는 아직 실제 중심 관심 지역을 찾지 못했습니다. 여기에 내가 가져 가라. 사람이 아무리 구부러져 있더라도 (실제로 문제가있는 특정 사례를 볼 수 있음)이 지역은 세로선과 비슷합니다. 이를 위해 길이 100의 세로선을 사용하여 형태 학적 개구부를 수행하여 현재 이미지를 단순화합니다.이 길이는 순전히 임의적입니다. 스케일링 문제가 없다면 결정하기 어려운 값이 아닙니다. 이제 다시 구성 요소를 폐기하지만이 단계에서 조금 더주의를 기울였습니다. 작은 영역으로 간주되는 것을 버리기 위해 이미지의 보완 영역으로 영역 별 열기를 사용했습니다.

이미지의 왼쪽 부분, 중앙 부분 및 오른쪽 부분의 세 부분이 있습니다. 중심 부분은 3 가지 중 더 작은 구성 요소 일 것으로 예상되므로 사소한 것이됩니다.

최종 결과는 오른쪽 하단 이미지가 원래 이미지의 왼쪽에 겹친 이미지 일뿐입니다. 개별 수치가 모두 일치하지는 않습니다. 서둘러 죄송합니다.

http://i.imgur.com/XRhYv.png


당신의 친절한 관심에 대해 대단히 감사하지만, 당신의 접근 방식은 내 데이터의 특정 속성 (고소가 아니라 세부 사항)을 고려해야합니다. 파이썬 matplotlib의 녹색 컬러 맵. 컬러 데이터 작업이 개념적으로 정확하다고 생각하지 않습니다. 이미지는 커뮤니케이션 목적으로 만 표시됩니다. 2) 실제 데이터는 표면 곡률 (볼록 vs. 오목)과 관련이 있으며, 빨간색 부분은 오목하고 녹색 부분은 볼록합니다. 대칭 축이 반드시 오목한 영역에 해당되는 것은 아닙니다.
heltonbiker

곧 더 많은 이미지를 그레이 스케일로 추가하여 이미지 자체를 테스트에 사용하여 색상으로 인한 다이내믹 레인지 왜곡의 위험을 제거 할 것입니다.
heltonbiker

불행히도 데이터는 아직 사용할 수 없습니다. 회색조 이미지는 근사치입니다.
mmgp

근사치가 충분하다고 생각하지만 실제 데이터를 제공하는 것은 중요하지 않습니다. 공개 DropBox 다운로드 링크를 게시 할 수 있지만 어떤 파일 형식인지 모릅니다.
heltonbiker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.