2017-07-26 44 views
-2

在OpenCV中我可以水平和垂直翻轉圖像使用此代碼:如何檢查如果圖像翻轉或不相對於基本圖像

import cv2 
img=cv2.imread('1.png') 
rimg=img.copy() 
fimg=img.copy() 
rimg=cv2.flip(img,1) 
fimg=cv2.flip(img,0) 
cv2.imshow("Original", img) 
cv2.imshow("vertical flip", rimg) 
cv2.imshow("horizontal flip", fimg) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 

我的問題是:有沒有什麼辦法來檢查輸入圖像相對於基礎圖像翻轉?我只想知道檢查圖像是否翻轉的步驟。

+0

一般來說,沒有。如果圖像不是以某種方式對稱的,那麼您可能只需沿着不同的軸進行翻轉並快速比較以檢查「np.any」是否不相同。 –

+0

我猜你可能可以總結頂部行,底部行,左邊緣和右邊緣(分開)的像素,並將邊緣與參考圖像進行比較。 –

回答

0

一般來說,沒有。如果圖像以某種方式不對稱,那麼您可能只需沿不同的軸進行翻轉,並快速比較以檢查是否有不平等。

def is_horizontally_flipped(orig, img): 
    tst = cv2.flip(img, 1) 
    return np.any(orig != tst) 
+0

這意味着我必須檢查所有可能的組合,以便根據orig圖像獲得完美視圖,就像我先將其水平翻轉然後垂直一樣,然後如何檢查 – Kallz

+0

我認爲翻轉所有可能組合的整個圖像非常昂貴。更好的只是「翻轉」座標來比較像素。 –

1

這裏是一個僞C++溶液:

bool isSameSize(Image a, Image b) 
{ 
    return a.width() == b.width() && a.height() == b.height(); 
} 
bool isNotFlipped(Image a, Image b) 
{ 
    if(!isSameSize(a, b)) return false; 
    for(int y = 0; y < a.height(); ++y) 
     for(int x = 0; x < a.width(); ++x) 
     { 
      if(a.pixel(x, y) != b.pixel(x, y)) 
       return false; 
     } 
    return true; 
} 
bool isFlippedHorizontal(Image a, Image b) 
{ 
    if(!isSameSize(a, b)) return false; 
    int w = a.width(); 
    for(int y = 0; y < a.height(); ++y) 
     for(int x = 0; x < a.width(); ++x) 
     { 
      if(a.pixel(x, y) != b.pixel(w - x - 1, y)) 
       return false; 
     } 
    return true; 
} 
bool isFlippedVertical(Image a, Image b) 
{ 
    if(!isSameSize(a, b)) return false; 
    int h = a.height(); 
    for(int y = 0; y < a.height(); ++y) 
     for(int x = 0; x < a.width(); ++x) 
     { 
      if(a.pixel(x, y) != b.pixel(x, h - y - 1)) 
       return false; 
     } 
    return true; 
} 
bool isFlippedBoth(Image a, Image b) 
{ 
    if(!isSameSize(a, b)) return false; 
    int w = a.width(); 
    int h = a.height(); 
    for(int y = 0; y < a.height(); ++y) 
     for(int x = 0; x < a.width(); ++x) 
     { 
      if(a.pixel(x, y) != b.pixel(w - x - 1, h - y - 1)) 
       return false; 
     } 
    return true; 
} 

HTH