2017-10-23 1 views
0

내 문제는 이미지 등록과 관련된 문제입니다. 나는 같은 크기의 .tif 파일에 여러 개의 이미지를 가지고있다. MATLAB을 매트릭스의 3D 배열로 읽은 다음 해당 이미지의 피쳐 오버레이를 회전만으로 최적화하려고합니다. 나는 imabsdiff를 사용해 보았지만, 아래와 같이 해보기 만했다. 간단히 말해, 스택에 이미지가있는만큼의 각도를 포함하는 벡터를 입력했습니다. 스택의 각 이미지를 각 해당 각도만큼 회전시킵니다. 그런 다음 imabsdiff가 수행하는 절대 차이 ([image1-image2] + [image2-image1])를 계산하지만 빠릅니다. 이를 위해 두 개의 루프 변수를 사용하여 각 이미지를 전체 스택과 비교하면서 동일한 이미지를 비교하지 않습니다. 비용은 모든 이미지 간의 차이의 합계입니다.많은 이미지 간의 차이 계산

for oo = 1:slidecount 
    centered_stack(:,:,oo) = imrotate(centered_stack(:,:,oo), 
    angle_in(oo), 'bilinear', 'crop'); 
end 

for pp = 1:slidecount 
    image1 = centered_stack(:,:,pp); 
    for qq = 1:slidecount 
     if qq ~= pp % only do this if comparing different images 
      image2 = centered_stack(:,:,qq); 
      cost_temp(qq) = sum(sum(abs(image1 - image2))) + 
      sum(sum(abs(image2 - image1))); 
     else 
      cost_temp(qq) = 0; 
     end 
     cost_temp = sum(cost_temp);  
    end 
    cost(pp) = cost_temp; 
end 

cost = sum(cost); 

이것은 다음 최적화 절차의 비용 값으로 사용됩니다. 좀 더 빠르고 어쩌면 벡터화 된 방법이 있는지 또는 개념적으로 완전히 다른 것을 누군가가 말해 줄 수 있습니까? 이 접근법은 많은 이미지들로 인해 매우 많은 시간을 필요로합니다. FFT 기반 등록은 아마도? 감사! 코드에서

+0

그냥 질문 : 회전 및 자르기, 당신은 검은 테두리 또는 그렇지 않으면 작은 크기의 이미지로 끝나지 않니? 그렇다면 이것은 인위적으로 절대 오류를 증가시키는 것 같습니다. 해결하려는 문제는 무엇입니까? 올바른 회전 각도 찾기? 또한, 어떤 MATLAB 버전을 사용하고 있습니까? 이미지 처리 도구 상자가 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 예, 이미지에서 피쳐 간의 최대 오버레이를 얻기 위해 올바른 회전 각도를 찾으려고합니다. 이미지 처리 도구 상자가 있지만 imabsdiff와 같은 것만으로도 시간이 더 걸립니다. MATLAB 버전은 2016b입니다. –

답변

0

당신은 두 번 이미지의 각 쌍을 비교 : IMAGE_2 (PP == 1, 전분기 == 2)

  • IMAGE_2이 IMAGE_1하기 (PP의 == 2, 전분기에

    1. IMAGE_1을 == 1)

    이것은 의도 한 것입니까? 이 같은 두 번째 루프 모양을 한 경우 :

    for qq = (pp+1):slidecount 
    

    당신은 또한 qq ~= pp를 확인하기위한 당신의 상태가 더 이상 필요하지 않습니다 2의 비율로 계산을 줄일 수 있습니다.

  • +0

    안녕하세요 pkic, 답장을 보내 주셔서 감사합니다. 당신은 정확합니다, 나는 내가 필요로하는 것보다 더 많은 이미지를 비교하는 것처럼 보입니다. 그것을 잡아 주셔서 감사합니다, 나는 당신의 제안을 시도합니다! –

    +0

    안녕하세요 @ drummy_1, 내 대답을 수락 해 주셔서 감사합니다. 나는 당신의 코드에 대해 의심의 여지가있다. mathematics에 대한 나의 understending은'abs (image1 - image2)'가'abs (image2-image1)'와 정확히 같다는 것을 알려줍니다. 이 작업을 두 번하는 특별한 이유가 있습니까? uint8 (10) - uint8 (5) = 5 인 동안 이미지가 uint8 유형 인 경우 uint8 (5) - uint8 (10) = 0과 같은 오버플로 문제가 있기 때문에 이러한 작업이 다를 수 있습니다. . 이것이 당신 문제라면, 코드가 정말로 원하는 것을하지 않기 때문에 이미지의 형식을 바꿀 것을 제안합니다. – pkic

    +0

    안녕하세요 pkic, 네 말이 맞아. 이건 uint8 사용의 문제 야. 그러나 이러한 이미지가 가능한 한 작게 변경되는 것이 매우 중요하므로 이미지를 그대로 유지합니다. 그리고이 경우 abs (image1-image2)를 사용하면 abs (image2-image1)와 다른 값을 얻을 수 있습니다. 그리고 놀랍게도 코드는 완벽하게 작동합니다! 고맙습니다! –