3.7 開發(fā)日記
心心念念的產(chǎn)學(xué)研終于在中期答辯之后開始了- -
之前都對于自己的產(chǎn)學(xué)研沒有一個計劃,也沒有一絲頭緒健盒,經(jīng)過中期答辯的準(zhǔn)備終于有了一個大致的方向和要學(xué)習(xí)努力的目標(biāo)耍群,所以打算更改之前只coding不記錄的作風(fēng),對于產(chǎn)學(xué)研遇到的問題和開發(fā)路徑都做一個較為詳述的記錄
那就讓我們愉快的開始吧b( ̄▽ ̄)d
邊緣檢測
我們都知道OCR算法是基于圖像的文字識別算法,和邊緣檢測有和什么關(guān)系分俯? 我們在進(jìn)行文本檢測的時候,并不是上來就直接對于文本進(jìn)行檢測哆料,首先要對圖片進(jìn)行預(yù)處理缸剪,先將無用的或者對檢測有影響的因素降到最小,才可以使我們的檢測效率提高一個檔次
第一步要進(jìn)行的操作就是邊緣檢測了东亦,邊緣檢測杏节,顧名思義就是對于文本對象的邊緣進(jìn)行標(biāo)注
代碼在下方
from transform import four_point_transform
import numpy as np
import argparse
import cv2
import imutils
# ap = argparse.ArgumentParser()
# ap.add_argument('-i','--image',required=True,help="Path to image file")
#
# args = vars(ap.parse_args())
#flag: 獲取了圖像路徑
image = cv2.imread('image/30.png')
ratio = image.shape[0] /500.0
orig = image.copy()
image = imutils.resize(image,height=500)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #灰度圖像
gray = cv2.GaussianBlur(gray,(5,5),0) #高斯模糊
edged = cv2.Canny(gray,75,200) #邊緣檢測
# flag : Test1 = BLOCK
print("STEP 1 Edge Detection")
cv2.imshow("Image",image)
cv2.imshow("Edge",edged)
cv2.waitKey(0)
cv2.destroyAllWindows()
首先引入必要的包
- numpy 是運算的必須包
- argparse 是方便python的命令行操作
- cv2 是openCV圖像處理庫
- imutils 是對于圖像進(jìn)行裁剪和切割的庫
為什么第一行有一個four_point_transform??這個并不是什么庫,而是我們自己實現(xiàn)的一個旋轉(zhuǎn)函數(shù)典阵,通過轉(zhuǎn)遞圖像和邊緣矩形的四個點奋渔,就可以通過透視轉(zhuǎn)換將不是正視投影的文本圖片轉(zhuǎn)化為正視角投影
同樣附上這個函數(shù)得代碼
ps: 可以在同一個文件夾下面創(chuàng)建一個新的transform.py 的文件
import numpy as np
import cv2
def order_points(pts):
#四個點按照左上、右上壮啊、右下嫉鲸、左下
#pts 是四個點的列表
rect = np.zeros((4,2),dtype="float32")
s = pts.sum(axis=1)
rect[0] = pts[np.argmin(s)]
rect[2] = pts[np.argmax(s)]
diff = np.diff(pts,axis = 1)
rect[1] = pts[np.argmin(diff)]
rect[3] = pts[np.argmax(diff)]
return rect
def four_point_transform(image, pts): #image 為需要透視變換的圖像 pts為四個點
rect = order_points(pts) #四點排序
(tl, tr, br, bl) = rect #方便計算
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max(int(widthA), int(widthB))
heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max(int(heightA), int(heightB))
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maxHeight - 1],
[0, maxHeight - 1]], dtype = "float32")
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
return warped
具體的函數(shù)實現(xiàn)以及每一行的意義已經(jīng)在四點透視變換網(wǎng)址中說的很詳細(xì)了,要了解細(xì)節(jié)可以查閱
總之這個函數(shù)就是通過讓你將邊緣的四個點傳入他巨,然后對于文本(帶有偏移量的或旋轉(zhuǎn)的文本)進(jìn)行一個截取與透視變換
回到我的第一個代碼塊
首先
ap = argparse.ArgumentParser()
ap.add_argument('-i','--image',required=True,help="Path to image file")
args = vars(ap.parse_args())
這三行注冊-i 命令行參數(shù)充坑,意義為輸入需要進(jìn)行處理的圖片路徑,這在之后的整合會很有用
最關(guān)鍵的就是這三句
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #灰度圖像
gray = cv2.GaussianBlur(gray,(5,5),0) #高斯模糊
edged = cv2.Canny(gray,75,200) #邊緣檢測
- 將圖像轉(zhuǎn)為灰度圖像
- 將圖像進(jìn)行高斯模糊
- 通過模糊之后的圖像進(jìn)行邊緣檢測
讓我們來看看效果
pyhon transform.py -i image/1.png
效果還不錯