主要流程:
1.首先得到灰度影像
2.對灰度影像進行二值化
3.然后找一個最小矩形框住物件輪廓(opencv中有相應的函式)
4.這個最小矩形的函式會回傳一個角度
5.我們利用這個角度得到一個旋轉的矩形(仿射變換所需要的)
6.使用仿射變換得到矯正后的影像
1.得到灰度影像
//讀取影像
src= cv.imread('imageTextR.png')
(h,w)=src.shape[:2]
//記錄影像寬高,后面會用
//cv.imshow('src',src)
//cvtColor函式用于轉換色彩空間,將影像轉換為GRAY灰度影像
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)

這是我們需要矯正的影像
2.對灰度影像進行二值化
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
#由于文本是黑底白字的,我們需要讓背景是黑色的,所以我們在傳入引數的時候需要使用cv.THRESH_BINARY_INV 加上_INV使二值圖反轉

這是二值圖
3.找一個最小矩形框住物件輪廓
coords=np.column_stack(np.where(binary>0))
np.where(binary>0):可以理解為找出二值圖中所有的白色
np.column_stack(np.where(binary>0)):將所有白色的像素統計起來

這里可以看到回傳的coords的大小是(24527,2)即二值圖中共有24527個白色像素點,
4.得到矩形角度
接下使用cv的minAreaRect函式求出最小外接矩形,傳入的引數要求為點集陣列或向量,回傳的引數有三個:1.矩形的中心點 2.矩形的長和寬 3.矩形的旋轉角度
angle =cv.minAreaRect(coords)[-1]
//[-1]表示回傳引數中的最后一個,即角度
角度是根據這個規則來的:

這里我們默認傾斜角度不是特別大,所以如果我們的傾斜角度大于-45度我們就將其矯正為水平的,如果小于-45度我們將其矯正為垂直的:
if angle<-45:
angle = -(90+angle)
else:
angle=-angle
center = (w//2,h//2)
//求出矩形中點
5.我們利用這個角度得到一個旋轉變換的矩形(仿射變換所需要的)
使用cv.getRotationMatrix2D()來得到選擇最小外接旋轉矩形,3個引數分別為旋轉中心,旋轉角度,旋轉后影像的縮放比例
M= cv.getRotationMatrix2D(center,angle,1.0)
6.使用仿射變換得到矯正后的影像
使用cv.warpAffine來進行仿射變換,傳入引數為:需要處理的影像,旋轉變換矩陣,寬高,flags:插值方法,borderMode:邊界填充
rotated = cv.warpAffine(src,M,(w,h),flags=cv.INTER_CUBIC,borderMode=cv.BORDER_REPLICATE)

得到的矯正后的圖片
如果覺得有用 點個贊哦 謝謝啦
最后附上完整代碼:
import numpy as np
import cv2 as cv
def binary(img):
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV|cv.THRESH_OTSU)
return binary
def Transformation(img,src):
coords=np.column_stack(np.where(img>0))
print(coords)
print(coords.shape)
angle =cv.minAreaRect(coords)[-1] #最小外接矩形
print(angle)
if angle<-45:
angle = -(90+angle)
else:
angle=-angle
center = (w//2,h//2)
M= cv.getRotationMatrix2D(center,angle,1.0) #傳入中心和角度 得到旋轉矩形
rotated = cv.warpAffine(src,M,(w,h),flags=cv.INTER_CUBIC,borderMode=cv.BORDER_REPLICATE)
cv.putText(rotated,'Angle:{:.2f} degrees'.format(angle),(10,30),cv.FONT_HERSHEY_SIMPLEX,0.7,(0,0,255),2)#繪制文字
cv.imshow('Rotated',rotated)
src= cv.imread('imageTextR.png')
(h,w)=src.shape[:2]
gray=cv.cvtColor(src,cv.COLOR_BGR2GRAY)
binary=binary(src)
Transformation(binary,src)
cv.imshow('src',src)
cv.imshow('binary',binary)
cv.waitKey(0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255135.html
標籤:AI
