python opencv實(shí)現(xiàn)圖像矯正功能
本文實(shí)例為大家分享了python opencv實(shí)現(xiàn)圖像矯正的具體代碼,供大家參考,具體內(nèi)容如下
問(wèn)題簡(jiǎn)介
一般的我們對(duì)圖像中的目標(biāo)進(jìn)行分析和檢測(cè)時(shí),往往目標(biāo)具有一定的傾斜角度,自然環(huán)境中正面向我們的目標(biāo)實(shí)際是很少的,那將這些傾斜的目標(biāo)“扶正”的過(guò)程就就叫做圖像矯正。

透視變換demo
圖像矯正使用的主要技術(shù)是透視變換。
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()函數(shù)
透視變換結(jié)果

透視變換使用很簡(jiǎn)單,關(guān)鍵是如何找到目標(biāo)的4個(gè)頂點(diǎn)。
如何找到目標(biāo)的4個(gè)頂點(diǎn)
如何找到這4個(gè)頂點(diǎn):
方法有很多種,如:直線檢測(cè),輪廓檢測(cè),最小外接矩形等。
使用輪廓檢測(cè)方式:
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) ? ? ? ? ? ?# 邊緣檢測(cè)
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ?# 輪廓檢測(cè)
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) # 根據(jù)輪廓面積從大到小排序
? ? for c in cnts:
? ? ? ? peri = cv2.arcLength(c, True) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 計(jì)算輪廓周長(zhǎng)
? ? ? ? approx = cv2.approxPolyDP(c, 0.02*peri, True) ? ? ? ? ? # 輪廓多邊形擬合
? ? ? ? # 輪廓為4個(gè)點(diǎn)表示找到紙張
? ? ? ? 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、對(duì)圖片進(jìn)行輪廓檢測(cè)
2、對(duì)檢測(cè)出的輪廓進(jìn)行多邊形逼近
3、多邊形為四邊形且輪廓面積最大的圖形為紙張
4、輸出標(biāo)記四個(gè)定點(diǎn)
cv2.approxPolyDP() 多邊形逼近
重點(diǎn)講解這個(gè)函數(shù)
作用:
對(duì)目標(biāo)圖像進(jìn)行近似多邊形擬合,使用一個(gè)較少頂點(diǎn)的多邊形去擬合一個(gè)曲線輪廓,要求擬合曲線與實(shí)際輪廓曲線的距離小于某一閥值。
函數(shù)原形:
cv2.approxPolyDP(curve, epsilon, closed) -> approxCurve
參數(shù):
curve : 圖像輪廓點(diǎn)集,一般由輪廓檢測(cè)得到
epsilon : 原始曲線與近似曲線的最大距離,參數(shù)越小,兩直線越接近
closed : 得到的近似曲線是否封閉,一般為True
返回值:
approxCurve :返回的擬合后的多邊形頂點(diǎn)集。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python腳本對(duì)GiteePages進(jìn)行一鍵部署的使用說(shuō)明
剛好之前有了解過(guò)python的自動(dòng)化,就想著自動(dòng)化腳本,百度一搜還真有類似的文章。今天就給大家分享下使用Python腳本對(duì)GiteePages進(jìn)行一鍵部署的使用說(shuō)明,感興趣的朋友一起看看吧2021-05-05
Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解
今天小編就為大家分享一篇關(guān)于Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Python使用?TCP協(xié)議實(shí)現(xiàn)智能聊天機(jī)器人功能
TCP協(xié)議適用于對(duì)效率要求相對(duì)較低而準(zhǔn)確性要求很高的場(chǎng)合,下面通過(guò)本文給大家介紹基于Python?使用?TCP?實(shí)現(xiàn)智能聊天機(jī)器人,需要的朋友可以參考下2022-05-05
用Python實(shí)現(xiàn)數(shù)據(jù)篩選與匹配實(shí)例
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)數(shù)據(jù)篩選與匹配實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
使用實(shí)現(xiàn)XlsxWriter創(chuàng)建Excel文件并編輯
今天小編就為大家分享一篇使用實(shí)現(xiàn)XlsxWriter創(chuàng)建Excel文件并編輯,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
python代碼實(shí)現(xiàn)煙花實(shí)例
這篇文章主要給大家分享了python煙花詳細(xì)的代碼,文章主要以python煙花的代碼展開全文,所以解說(shuō)會(huì)比較少,代碼較多。喜歡的小伙伴可以參考一下,希望對(duì)你有所幫助2021-12-12

