opencv+python實(shí)現(xiàn)圖像矯正
本文實(shí)例為大家分享了opencv+python實(shí)現(xiàn)圖像矯正的具體代碼,供大家參考,具體內(nèi)容如下
需求:將斜著拍攝的文本圖像進(jìn)行矯正
python代碼
import numpy as np import cv2 as cv def shape_correction(img): ? ? (height, width) = img.shape[:2] ? ? print(img.shape) ? ? img_gau = cv.GaussianBlur(img, (5, 5), 0) ? ? canny = cv.Canny(img_gau, 60, 200) ? ? # cv.imshow("g-canny", canny) ? ?? ? ? kernel = cv.getStructuringElement(cv.MORPH_CROSS, (4,3))? ? ?? ? ? dilated = cv.dilate(canny, kernel, iterations=8) ? ? ? # cv.imshow('img_dilated', dilated) ? ? # 尋找輪廓 ? ? contours, hierarchy = cv.findContours(dilated, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE) ? ? # print(len(contours), hierarchy, sep='\n') ? ? # 找到最外層面積最大的輪廓 ? ? area = 0 ? ? # print("area:{}".format(area)) ? ? index = 0 ? ? for i in range(len(contours)): ? ? ? ? x, y, w, h = cv.boundingRect(contours[i]) ? ? ? ? # 排除非文本區(qū)域 ? ? ? ? if w < 35 and h < 35: ? ? ? ? ? ? continue ? ? ? ? # 防止矩形區(qū)域過大不精準(zhǔn) ? ? ? ? ? ? if h > 0.99 * height or w > 0.99 * width: ? ? ? ? ? ? continue ? ? ? ? # draw rectangle around contour on original image ? ? ? ? # cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2) ? ? ? ? tmpArea = w * h ? ? ? ? if tmpArea >= area: ? ? ? ? ? ? area = tmpArea ? ? ? ? ? ? index = i ? ? # 得到最小外接矩形的(中心(x,y), (寬,高), 旋轉(zhuǎn)角度) ? ? rect = cv.minAreaRect(contours[index]) ? ? # 畫出矩形框 ? ? # box = cv.boxPoints(rect) ? ? # box = np.int0(box) ? ? # cv.drawContours(img, [box], 0, (0, 0, 255), 2) ? ? # cv.imshow('img', img) ? ? print("rect:{}".format(rect)) ? ? angle = rect[-1] ? ? # print(angle) ? ? # 角度大于85度或小于5度不矯正 ? ? if angle > 85 or angle < 5: ? ? ? ? angle = 0 ? ? elif angle < 45: ? ? ? ? angle = angle - 0 ? ? else: ? ? ? ? angle = angle - 90 ? ? M = cv.getRotationMatrix2D(rect[0], angle, 1) ? ? rotated = cv.warpAffine(img, M, (width, height), flags=cv.INTER_CUBIC, borderValue=(255, 255, 255)) ? ?? ? ? cv.imshow('Rotated', rotated) ? ? return rotated src = cv.imread('/res-normal.png', 0) rotated = shape_correction(src) cv.waitKey(0)
算法流程
算法核心思想:
獲取圖像中的文本區(qū)域矩形輪廓,找到其中面積最大的,對(duì)其進(jìn)行最小外接矩形計(jì)算,得到最小外接矩形的旋轉(zhuǎn)角度,再根據(jù)旋轉(zhuǎn)角度進(jìn)行仿射變換。
測(cè)試效果
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python + selenium + crontab實(shí)現(xiàn)每日定時(shí)自動(dòng)打卡功能
這篇文章主要介紹了Python + selenium + crontab實(shí)現(xiàn)每日定時(shí)自動(dòng)打卡功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03python模擬投擲色子并數(shù)據(jù)可視化統(tǒng)計(jì)圖
這篇文章主要介紹了python模擬投擲色子并數(shù)據(jù)可視化統(tǒng)計(jì)圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07python csv實(shí)時(shí)一條一條插入且表頭不重復(fù)問題
這篇文章主要介紹了python csv實(shí)時(shí)一條一條插入且表頭不重復(fù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05pyenv與virtualenv安裝實(shí)現(xiàn)python多版本多項(xiàng)目管理
這篇文章主要介紹了pyenv與virtualenv安裝實(shí)現(xiàn)python多版本多項(xiàng)目管理過程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)隨機(jī)游走的詳細(xì)解釋
這篇文章主要介紹了Python實(shí)現(xiàn)隨機(jī)游走的詳細(xì)解釋,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03