<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    [Python圖像處理] 十二.圖像幾何變換之圖像仿射變換、圖像透視變換和圖像校正

    VSole2022-07-14 21:28:47

    一.圖像仿射變換

    圖像仿射變換又稱為圖像仿射映射,是指在幾何中,一個向量空間進行一次線性變換并接上一個平移,變換為另一個向量空間。通常圖像的旋轉加上拉升就是圖像仿射變換,仿射變換需要一個M矩陣實現,但是由于仿射變換比較復雜,很難找到這個M矩陣.

    OpenCV提供了根據變換前后三個點的對應關系來自動求解M的函數——cv2.getAffineTransform(pos1,pos2),其中pos1和pos2表示變換前后的對應位置關系,輸出的結果為仿射矩陣M,接著使用函數cv2.warpAffine()實現圖像仿射變換。圖1是仿射變換的前后效果圖。

    圖像仿射變換的函數原型如下:

    M = cv2.getAffineTransform(pos1,pos2)

    • pos1表示變換前的位置
    • pos2表示變換后的位置

    cv2.warpAffine(src, M, (cols, rows))

    • src表示原始圖像
    • M表示仿射變換矩陣
    • (rows,cols)表示變換后的圖像大小,rows表示行數,cols表示列數

    實現代碼如下所示:

    #encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt
    #讀取圖片src = cv2.imread('test.bmp')
    #獲取圖像大小rows, cols = src.shape[:2]
    #設置圖像仿射變換矩陣pos1 = np.float32([[50,50], [200,50], [50,200]])pos2 = np.float32([[10,100], [200,50], [100,250]])M = cv2.getAffineTransform(pos1, pos2)
    #圖像仿射變換result = cv2.warpAffine(src, M, (cols, rows))
    #顯示圖像cv2.imshow("original", src)cv2.imshow("result", result)
    #等待顯示cv2.waitKey(0)cv2.destroyAllWindows()
    

    輸出效果圖如下所示:


    二.圖像透視變換

    圖像透視變換(Perspective Transformation)的本質是將圖像投影到一個新的視平面,同理OpenCV通過函數cv2.getPerspectiveTransform(pos1,pos2)構造矩陣M,其中pos1和pos2分別表示變換前后的4個點對應位置。得到M后在通過函數cv2.warpPerspective(src,M,(cols,rows))進行透視變換。

    圖像透視變換的函數原型如下:

    M = cv2.getPerspectiveTransform(pos1, pos2)

    • pos1表示透視變換前的4個點對應位置
    • pos2表示透視變換后的4個點對應位置

    cv2.warpPerspective(src,M,(cols,rows))

    • src表示原始圖像
    • M表示透視變換矩陣
    • (rows,cols)表示變換后的圖像大小,rows表示行數,cols表示列數

    代碼如下:


    #encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt
    #讀取圖片src = cv2.imread('test01.jpg')
    #獲取圖像大小rows, cols = src.shape[:2]
    #設置圖像透視變換矩陣pos1 = np.float32([[114, 82], [287, 156], [8, 322], [216, 333]])pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])M = cv2.getPerspectiveTransform(pos1, pos2)
    #圖像透視變換result = cv2.warpPerspective(src, M, (190, 272))
    #顯示圖像cv2.imshow("original", src)cv2.imshow("result", result)
    #等待顯示cv2.waitKey(0)cv2.destroyAllWindows()
    

    輸出結果如下圖所示:


    三.基于圖像透視變換的圖像校正

    下面參考 t6_17大神 的文章,通過圖像透視變換實現圖像校正功能。假設現在存在一張A4紙圖像,現在需要通過調用圖像透視變換校正圖像。

    代碼如下所示:

    #encoding:utf-8import cv2import numpy as npimport matplotlib.pyplot as plt
    #讀取圖片src = cv2.imread('test01.jpg')
    #獲取圖像大小rows, cols = src.shape[:2]
    #將源圖像高斯模糊img = cv2.GaussianBlur(src, (3,3), 0)#進行灰度化處理gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #邊緣檢測(檢測出圖像的邊緣信息)edges = cv2.Canny(gray,50,250,apertureSize = 3)cv2.imwrite("canny.jpg", edges)
    #通過霍夫變換得到A4紙邊緣lines = cv2.HoughLinesP(edges,1,np.pi/180,50,minLineLength=90,maxLineGap=10)
    #下面輸出的四個點分別為四個頂點for x1,y1,x2,y2 in lines[0]:    print(x1,y1),(x2,y2)for x1,y1,x2,y2 in lines[1]:    print(x1,y1),(x2,y2)
    #繪制邊緣for x1,y1,x2,y2 in lines[0]:    cv2.line(gray, (x1,y1), (x2,y2), (0,0,255), 1)
    #根據四個頂點設置圖像透視變換矩陣pos1 = np.float32([[114, 82], [287, 156], [8, 322], [216, 333]])pos2 = np.float32([[0, 0], [188, 0], [0, 262], [188, 262]])M = cv2.getPerspectiveTransform(pos1, pos2)
    #圖像透視變換result = cv2.warpPerspective(src, M, (190, 272))
    #顯示圖像cv2.imshow("original", src)cv2.imshow("result", result)
    #等待顯示cv2.waitKey(0)cv2.destroyAllWindows()
    

    運行結果如下圖所示:


    四.圖像幾何變換總結

    最后補充圖像幾何代碼所有變換,希望讀者能體會下相關的代碼,并動手實踐下。輸出結果以女神為例:

    完整代碼如下:

    #encoding:utf-8import cv2  import numpy as npimport matplotlib.pyplot as plt #讀取圖片img = cv2.imread('test3.jpg')image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    #圖像平移矩陣M = np.float32([[1, 0, 80], [0, 1, 30]])rows, cols = image.shape[:2]img1 = cv2.warpAffine(image, M, (cols, rows))
    #圖像縮小img2 = cv2.resize(image, (200,100))
    #圖像放大img3 = cv2.resize(image, None, fx=1.1, fy=1.1)
    #繞圖像的中心旋轉#源圖像的高、寬 以及通道數rows, cols, channel = image.shape#函數參數:旋轉中心 旋轉度數 scaleM = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1) #函數參數:原始圖像 旋轉參數 元素圖像寬高img4 = cv2.warpAffine(image, M, (cols, rows))
    #圖像翻轉img5 = cv2.flip(image, 0)   #參數=0以X軸為對稱軸翻轉 img6 = cv2.flip(image, 1)   #參數>0以Y軸為對稱軸翻轉
    #圖像的仿射pts1 = np.float32([[50,50],[200,50],[50,200]])pts2 = np.float32([[10,100],[200,50],[100,250]])M = cv2.getAffineTransform(pts1,pts2)img7 = cv2.warpAffine(image, M, (rows,cols))
    #圖像的透射pts1 = np.float32([[56,65],[238,52],[28,237],[239,240]])pts2 = np.float32([[0,0],[200,0],[0,200],[200,200]])M = cv2.getPerspectiveTransform(pts1,pts2)img8 = cv2.warpPerspective(image,M,(200,200))
    #循環顯示圖形titles = [ 'source', 'shift', 'reduction', 'enlarge', 'rotation', 'flipX', 'flipY', 'affine', 'transmission']  images = [image, img1, img2, img3, img4, img5, img6, img7, img8]  for i in xrange(9):     plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')     plt.title(titles[i])     plt.xticks([]),plt.yticks([])  plt.show()  
    

    感謝在求學路上的同行者,不負遇見,勿忘初心。月是故鄉圓啊~

    簡單紀念下,CSDN閱讀量即將破千萬,全網粉絲近30萬。十年啊,近700篇文章,確實可以說一句:這就是我20到30歲的青春,這里既有技術博客,也有娜璋珞一家的故事,我們的愛情史,也見證了一個自幼受貴州大山熏陶的學子慢慢成長,讓我認識了許許多多的博友。如蘇老師,受盡挫折,博士畢業,回到家鄉玉林成為了一名大學老師,更是自費建成了化學實驗室,只想將自己的所學所感傳遞給他的學生。十年,我在CSDN認識了許多這樣的博友、老師和大佬,我們從未謀面,我們天南地北,但相互鼓勵,苔花如米小,也學牡丹開。
    最后,感謝CSDN,這些年讓我騙了很多禮物,更感謝每一位閱讀過娜璋故事,每一位給我技術博客點贊的讀者。也希望大家記住一個叫Eastmount的分享者,對,不是什么專家,也不是什么大佬,就是一個默默撰寫博客的技術分享者,因為愛所以寫(今年太忙寫得很少很少)。我還將在CSDN寫二十年,三十年,一輩子,也將記錄我們一家的故事。好想繼續抒寫我們的故事,但太忙太忙,畢業后再好好寫吧。
    希望能早日畢業,回到家鄉貴州繼續當個教書匠,感覺好多要分享的博客,好多要上的課程,好多要開源的代碼,好多要學習的知識,期待再次站在講臺前的那一天。繼續沉下心去學習,雖菜但勤,感恩遇見,繼續加油,晚安娜!
    矩陣仿射變換
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Python圖像處理第12篇介紹圖像幾何變換基礎知識
    CTF密碼學-加解密總結
    2021-10-18 15:14:29
    密碼學(在西歐語文中,源于希臘語kryptós“隱藏的”,和gráphein“書寫”)是研究如何隱密地傳遞信息的學科。 在現代特別指對信息以及其傳輸的數學性研究,常被認為是數學和計算機科學的分支,和信息論也密切相關。 著名的密碼學者Ron Rivest解釋道:“密碼學是關于如何在敵人存在的環境中通訊”,自工程學的角度,這相當于密碼學與純數學的異同。 密碼學是信息安全等相關議題,如認證、訪問控
    多引擎場景里引擎之間的相似性會對整體的結果產生影響,到底哪些相似又如何衡量?
    云服務器攻防矩陣
    2022-01-07 13:27:51
    云服務器(Cloud Virtual Machine,CVM)是一種較為常見的云服務,為用戶提供安全可靠以及高效的計算服務。用戶可以靈活的擴展以及縮減計算資源,以適應變化的業務需求。使用云服務器可以極大降低用戶的軟硬件采購成本以及IT 運維成本。 由于云服務器中承載著用戶的業務以及數據,其安全性尤為重要而云服務器的風險往往來自于兩方面:云廠商平臺側的風險與用戶在使用云服務器時的風險。與用戶側風險
    Mitre公司最近發布的D3FEND矩陣能夠提供強化網絡、檢測和隔離威脅以及從網絡中欺騙和驅逐攻擊者的方法。
    3月27日,國內工業網絡安全專業廠商天地和興正式發布了全新的產品矩陣,以物聯、智能、運維為新三重防護重點,以檢測、評估、防護、協同、審計、平臺為產品重點,形成一套更為完善的工業網絡安全產品體系。
    將AD域日志引入日志分析平臺,通過模擬域攻擊行為產生攻擊事件,以攻擊日志提取關鍵特征,構建安全規則,形成檢測策略。通過監測5145事件,可識別到可疑的Sharphound域信息探測行為。通過監測4728事件,關注敏感用戶組特權賬號添加情況。通過監測4663事件,從而發現嘗試LSASS進程竊取憑證的操作。通過監測4624事件,設置白名單機制,從正常的訪問行為中,找出異常登錄行為。
    攻擊者采用了哪些DNS攻擊技術,哪些組織可以幫助事件響應團隊檢測、緩解和預防這些技術?FIRST近日發布的DNS攻擊與防御矩陣提供了答案。
    烏克蘭軍隊在俄烏戰爭期間通過衛星通信和定制軟件臨時搭建了連接無人機、戰士和武器的網絡,為該國軍隊提供了一定程度的情報、協調和準確性,從而能夠與俄羅斯龐大但行動遲緩的軍隊周旋。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类