1. 程式人生 > 程式設計 >利用Python將圖片中扭曲矩形的復原

利用Python將圖片中扭曲矩形的復原

前言

日常生活中,手殘黨們經常會把一些照片拍歪,比如拍個證件、試卷、PPT什麼的,

比如下面這本書的封面原本是個矩形,隨手一拍就成了不規則四邊形

想要把它變成規則的矩形,有什麼辦法呢?

利用Python將圖片中扭曲矩形的復原

你一定想到了 PS,因為網上很多教程就是這麼教的

開啟PS ⟹\Longrightarrow⟹ 濾鏡 ⟹\Longrightarrow⟹鏡頭校正 ⟹\Longrightarrow⟹自定 ⟹\Longrightarrow⟹變換

可是這樣手工的調整數值實在是費勁喲!!

利用Python將圖片中扭曲矩形的復原

下面我們來寫個程式,自動將圖片恢復到任意矩形!

程式實現

1. 開啟圖片並顯示

import cv2 as cv
import numpy as np

path = './book.jpg'
src = cv.imread(path)

def get_window_size(src,bound=600):
 h,w = src.shape[0],src.shape[1]
 if h > w:
  h,w = bound,int(w*bound/h)
 else:
  h,w = int(h*bound/w),bound
 return (h,w)

h,w = get_window_size(src)

win_name = 'RecAdjust'
cv.namedWindow(win_name,cv.WINDOW_NORMAL)
cv.resizeWindow(win_name,width=w,height=h)
cv.imshow(win_name,src)
cv.waitKey(0)
cv.destroyAllWindows()

2. 在圖片中標記四個角點

利用Python將圖片中扭曲矩形的復原

src_copy = src.copy()

class Indexer:
 def __init__(self,bound=4):
  self.id = 0
  self.bound=bound
 
 def get_id(self):
  self.id = (self.id+1)%self.bound
  return (self.id-1)%self.bound+1

def on_EVENT_LBUTTONDOWN(event,x,y,flags,param):
 if event == cv.EVENT_LBUTTONDOWN:
  
  img = param['src']
  win_name = param['window']
  indexer = param['indexer']
  points = param['points']
  
  curr_id = indexer.get_id()
  points.append((x,y))
  print('第{}個頂點: ({},{})'.format(curr_id,y))
  
  cv.circle(img,(x,y),10,(0,255),thickness = 2)
  cv.putText(
   img,str(curr_id),# 文字
   (x,# 座標
   cv.FONT_HERSHEY_PLAIN,5,# 字號
   (0,# 字型顏色
   thickness = 2   # 粗細
  )

  cv.imshow(win_name,img)

points = []
indexer = Indexer()
win_name = 'RecAdjust'
cv.namedWindow(win_name,src)
cv.setMouseCallback(win_name,on_EVENT_LBUTTONDOWN,param={'src':src,'window':win_name,'indexer':indexer,'points':points})
cv.waitKey(0)
cv.destroyAllWindows()
print(points)

3. 設定輸出矩形大小

# W = int(input('輸出圖片寬度:'))
# H = int(input('輸出圖片高度:'))
W,H = 600,800
target_points = [(0,0),(W,H),H)]

4. 求解透視變換矩陣

points,target_points = np.array(points,dtype=np.float32),np.array(target_points,dtype=np.float32)
M = cv.getPerspectiveTransform(points,target_points)
print('透視變換矩陣:',M)

5. 透視變換並儲存圖片

result = cv.warpPerspective(src_copy,M,0))
result = result[:H,:W]
win_name = 'Result'
cv.namedWindow(win_name,width=W,height=H)
cv.imshow(win_name,result)
cv.waitKey(0)
cv.destroyAllWindows()

output_file = 'result.jpg'
cv.imwrite(output_file,result)

結果如下

利用Python將圖片中扭曲矩形的復原

結果沒有想象的完美,是因為書的封面已經不是一個平面了,書角翹起。。。

如果圖片中的矩形在一個平面上的話,效果還是挺不錯的!!

利用Python將圖片中扭曲矩形的復原

完整程式碼下載

可關注後免費下載喔:https://download.csdn.net/download/itnerd/12819535(本地下載)

總結

到此這篇關於利用Python將圖片中扭曲矩形復原的文章就介紹到這了,更多相關Python圖片扭曲矩形復原內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!