1. 程式人生 > 程式設計 >Python+OpenCV 實現圖片無損旋轉90°且無黑邊

Python+OpenCV 實現圖片無損旋轉90°且無黑邊

0. 引言

有如上一張圖片,在以往的影象旋轉處理中,往往得到如圖所示的圖片。

然而,在進行一些其他影象處理或者影象展示時,黑邊帶來了一些不便。本文解決圖片旋轉後出現黑邊的問題,實現了圖片尺寸不變的旋轉(以上提到的黑邊是圖片的一部分)。

1. 方法流程

(1)旋轉圖片,得到有黑邊的旋轉圖片。

(2)找出圖片區域(不含黑邊)的位置。

(3)建立一個空圖片(其實是矩陣)。

(4)將圖片區域搬到此空圖片。

2. 程式

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
This program is debugged by Harden Qiu.
You can send a e-mail to [email protected] for more details.
"""
import numpy as np
import cv2
def main():
  img = cv2.imread('.\\imgs\\img10.jpg')
  height,width = img.shape[:2]

  matRotate = cv2.getRotationMatrix2D((height * 0.5,width * 0.5),-90,1)
  dst = cv2.warpAffine(img,matRotate,(width,height*2))
  rows,cols = dst.shape[:2]

  for col in range(0,cols):
    if dst[:,col].any():
      left = col
      break

  for col in range(cols-1,-1):
    if dst[:,col].any():
      right = col
      break

  for row in range(0,rows):
    if dst[row,:].any():
      up = row
      break

  for row in range(rows-1,-1):
    if dst[row,:].any():
      down = row
      break

  res_widths = abs(right - left)
  res_heights = abs(down - up)
  res = np.zeros([res_heights,res_widths,3],np.uint8)

  for res_width in range(res_widths):
    for res_height in range(res_heights):
      res[res_height,res_width] = dst[up+res_height,left+res_width]

  cv2.imshow('res',res)

  cv2.imshow('img',img)
  cv2.imshow('dst',dst)
  cv2.waitKey(0)

if __name__ =='__main__':
  main()

說明:img表示原圖,dst表示旋轉後圖片,res表示最終處理獲取的圖片。

執行程式,得到如圖所示的圖片,解決了遇到的問題。

3. 總結

本影象處理方法用到了以下幾個重要函式:

cv2.getRotationMatrix2D

cv2.warpAffine

程式設計過程中,要理清楚圖片各個畫素點的橫縱變化及其變化大小。在進行畫素傳遞時,要注意對應關係。

以上這篇Python+OpenCV 實現圖片無損旋轉90°且無黑邊就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。