日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

唐宇迪ocr检测图片

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 唐宇迪ocr检测图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

唐宇迪OCR檢測文檔

  • 邊緣檢測
  • 獲取輪廓
  • 透視變換
  • ocr識別

本文主要是學習唐宇迪ocr檢測圖片的工具和步驟

邊緣檢測

  • 讀取圖片(要備份)并求出圖片比例,按照一定比例變換原圖大小。
  • image = cv2.imread(args["image"]) #坐標也會相同變化 ratio = image.shape[0] / 500.0 orig = image.copy()image = resize(orig, height = 500)
  • 常見的預處理操作,彩圖轉化為灰度圖,(高斯)濾波操作,(Canny)邊緣檢測
  • gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) edged = cv2.Canny(gray, 75, 200)

    獲取輪廓

  • 畫出輪廓,給輪廓按照面積大小排序,找到需要的前五個輪廓
  • cnts, hierarchy= cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]
  • 找到具有規則形狀的輪廓
  • for c in cnts:# 計算輪廓近似peri = cv2.arcLength(c, True)# C表示輸入的點集# epsilon表示從原始輪廓到近似輪廓的最大距離,它是一個準確度參數# True表示封閉的approx = cv2.approxPolyDP(c, 0.02 * peri, True)# 4個點的時候就拿出來if len(approx) == 4:screenCnt = approxbreak

    這兒所謂具有規則形狀的輪廓,必須要求有4個頂點,不一定是矩形。
    cv2.arcLength(c, True) 求的是輪廓周長
    cv2.approxPolyDP(c, 0.02 * peri, True) 按照算法將輪廓填充完整,0.02 * peri是精度

  • 將獲取的輪廓在原圖畫出來(已經改變了原圖)
  • cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2)

    透視變換

  • 把圖片拉正,變為一個規整的矩形,第二個參數把變換后的輪廓的坐標點放大為原來的大小
  • warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)

    透視變換的具體代碼如下

    def four_point_transform(image,pts):rect = order_points(pts)(tl,tr,br,bl) = rect# 計算輸入的w和h值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

    先求出輪廓坐標連線的歐氏距離,取長和寬的最大值為一個矩形標準,再求出變換矩陣M,把原來的四邊形變換到矩形標準框內。

  • 對透視變換的圖重新進行灰度轉換,二值處理,保存到本地,供ocr工具進行識別
  • warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) ref = cv2.threshold(warped, 100, 255, cv2.THRESH_BINARY)[1] cv2.imwrite('scan.jpg', ref)

    總結一下,第一次灰度轉換+濾波+邊緣檢測是為了求出輪廓,從而進行坐標點定位,第二次灰度轉換+二值處理是為了得到對比度更鮮明的圖片,方便ocr工具識別。

    ocr識別

    # https://digi.bib.uni-mannheim.de/tesseract/ # 配置環境變量如E:\Program Files (x86)\Tesseract-OCR # tesseract -v進行測試 # tesseract XXX.png 得到結果 # pip install pytesseract # anaconda lib site-packges pytesseract pytesseract.py # tesseract_cmd 修改為絕對路徑即可 from PIL import Image import pytesseract import cv2 import ospreprocess = 'blur' #threshimage = cv2.imread('scan.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)if preprocess == "thresh":gray = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]if preprocess == "blur":gray = cv2.medianBlur(gray, 3)filename = "{}.png".format(os.getpid()) cv2.imwrite(filename, gray)text = pytesseract.image_to_string(Image.open(filename)) print(text) os.remove(filename)cv2.imshow("Image", image) cv2.imshow("Output", gray) cv2.waitKey(0)

    對圖片進行中值濾波,濾掉噪點,ocr將識別結果打印到控制臺。

    總結

    以上是生活随笔為你收集整理的唐宇迪ocr检测图片的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。