首頁 > 軟體

python opencv實現影象矯正功能

2022-08-01 14:02:44

本文範例為大家分享了python opencv實現影象矯正的具體程式碼,供大家參考,具體內容如下

問題簡介

一般的我們對影象中的目標進行分析和檢測時,往往目標具有一定的傾斜角度,自然環境中正面向我們的目標實際是很少的,那將這些傾斜的目標“扶正”的過程就就叫做影象矯正。

透視變換demo

影象矯正使用的主要技術是透視變換。
python-opencv 透視變換demo如下:

import cv2
import numpy as np

img = cv2.imread('/home/pzs/圖片/1.jpeg')

result3 = img.copy()

img = cv2.GaussianBlur(img,(3,3),0)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,50,150,apertureSize = 3)
cv2.imwrite("canny.jpg", edges)

src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
m = cv2.getPerspectiveTransform(src, dst)
result = cv2.warpPerspective(result3, m, (337, 488))
cv2.imshow("result", result)
cv2.waitKey(0)

主要是使用cv2.warpPerspective()函數

透視變換結果

透視變換使用很簡單,關鍵是如何找到目標的4個頂點。

如何找到目標的4個頂點

如何找到這4個頂點:
方法有很多種,如:直線檢測,輪廓檢測,最小外接矩形等。

使用輪廓檢測方式:

import cv2
import imutils

img = cv2.imread('1.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
dilate = cv2.dilate(blurred, cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)))
edged = cv2.Canny(dilate, 30, 120, 3)            # 邊緣檢測

cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 輪廓檢測
cnts = cnts[0] if imutils.is_cv2() else cnts[1]  # 判斷是opencv2還是opencv3
docCnt = None

if len(cnts) > 0:
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True) # 根據輪廓面積從大到小排序
    for c in cnts:
        peri = cv2.arcLength(c, True)                                       # 計算輪廓周長
        approx = cv2.approxPolyDP(c, 0.02*peri, True)           # 輪廓多邊形擬合
        # 輪廓為4個點表示找到紙張
        if len(approx) == 4:
            docCnt = approx
            break

for peak in docCnt:
    peak = peak[0]
    cv2.circle(img, tuple(peak), 10, (255, 0, 0))

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

原理:

1、對圖片進行輪廓檢測
2、對檢測出的輪廓進行多邊形逼近
3、多邊形為四邊形且輪廓面積最大的圖形為紙張
4、輸出標記四個定點

cv2.approxPolyDP() 多邊形逼近

重點講解這個函數

作用:

對目標影象進行近似多邊形擬合,使用一個較少頂點的多邊形去擬合一個曲線輪廓,要求擬合曲線與實際輪廓曲線的距離小於某一閥值。

函數原形:

cv2.approxPolyDP(curve, epsilon, closed) -> approxCurve

引數:

curve : 影象輪廓點集,一般由輪廓檢測得到
epsilon : 原始曲線與近似曲線的最大距離,引數越小,兩直線越接近
closed : 得到的近似曲線是否封閉,一般為True

返回值:

approxCurve :返回的擬合後的多邊形頂點集。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com