国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于OpenCV-Python的圖像位置校正和版面分析

這篇具有很好參考價值的文章主要介紹了基于OpenCV-Python的圖像位置校正和版面分析。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言

使用opencv對圖像進(jìn)行操作,要求:(1)定位銀行票據(jù)的四條邊,然后旋正。(2)根據(jù)版面分析,分割出小寫金額區(qū)域。

基于OpenCV-Python的圖像位置校正和版面分析

圖像校正

首先是對圖像的校正

  1. 讀取圖片
  2. 對圖片二值化
  3. 進(jìn)行邊緣檢測
  4. 對邊緣的進(jìn)行霍夫曼變換
  5. 將變換結(jié)果從極坐標(biāo)空間投影到笛卡爾坐標(biāo)得到傾斜角
  6. 根據(jù)傾斜角對主體校正
import os
import cv2
import math
import numpy as np
from scipy import ndimage


filepath = './task1-misc/'
filename = 'bank-bill.bmp'
filename_correct = 'bank-bill-correct.png'

def image_correction(input_path: str, output_path: str) -> bool:
    # 讀取圖像
    img = cv2.imread(input_path)
    # 二值化
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 邊緣檢測
    edges = cv2.Canny(gray,50,150,apertureSize = 3)
    #霍夫變換
    lines = cv2.HoughLines(edges,1,np.pi/180,0)
    for rho,theta in lines[0]:
        a = np.cos(theta)   # 將極坐標(biāo)轉(zhuǎn)換為直角坐標(biāo)
        b = np.sin(theta)
        x0 = a*rho
        y0 = b*rho
        x1 = int(x0 + 1000*(-b))    # 保證端點(diǎn)夠遠(yuǎn)能夠覆蓋整個圖像
        y1 = int(y0 + 1000 * a)
        x2 = int(x0 - 1000*(-b))
        y2 = int(y0 - 1000 * a)
        if x1 == x2 or y1 == y2:
            continue
        t = float(y2-y1)/(x2-x1)
        # 得到角度后將角度范圍調(diào)整至-45至45度之間
        rotate_angle = math.degrees(math.atan(t))
        if rotate_angle > 45:
            rotate_angle = -90 + rotate_angle
        elif rotate_angle < -45:
            rotate_angle = 90 + rotate_angle
        # 圖像根據(jù)角度進(jìn)行校正
        rotate_img = ndimage.rotate(img, rotate_angle)
        # 在圖中畫出線
        cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
        cv2.imwrite(filepath + 'marked-'+filename_correct, img)
        # 輸出圖像
        cv2.imwrite(output_path, rotate_img)
        return True
    
input_path = filepath + filename
output_path = filepath + filename_correct
if image_correction(input_path, output_path):
    print("角度校正成功")

圖(左)中的紅線斜率和偏置是經(jīng)過霍夫變換并進(jìn)行極坐標(biāo)轉(zhuǎn)換后得到,后續(xù)將根據(jù)這條線進(jìn)行角度的校正,校正后的結(jié)果如圖(右)所示。

基于OpenCV-Python的圖像位置校正和版面分析
為了便于后續(xù)操作,我們選擇將背景去掉,保存為.png圖片。
filename_clear = 'bank-bill-clear.png'
# 去除背景
def remove_background(input_path: str, output_path: str) -> bool:
    # 讀取圖像
    img = cv2.imread(input_path, cv2.IMREAD_UNCHANGED)

    # 檢查是否已經(jīng)具有 alpha 通道,如果沒有則創(chuàng)建一個
    if img.shape[2] == 3:
        alpha_channel = np.ones_like(img[:, :, 0], dtype=img.dtype) * 255
        img = np.dstack((img, alpha_channel))

    # 提取圖像的 alpha 通道(透明度)
    alpha_channel = img[:, :, 3]

    # 將白色或黑色(背景)的像素設(shè)置為透明
    alpha_channel[(img[:, :, :3] == [255, 255, 255]).all(axis=2)] = 0
    alpha_channel[(img[:, :, :3] == [0, 0, 0]).all(axis=2)] = 0
    # 保存為帶有透明通道的 PNG 圖像
    cv2.imwrite(output_path, img)
    return True
input_path = filepath + filename_correct 
output_path = filepath + filename_clear  
if remove_background(input_path, output_path):
    print("去除背景成功")

版面分析與分割金額區(qū)域

使用opencv對圖像進(jìn)行版面分析得到表格線的投影。

def detectTable(img, save_path):

    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    thresh_img = cv2.adaptiveThreshold(~gray_img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,-2)
    
    h_img = thresh_img.copy()
    v_img = thresh_img.copy()
    scale = 20
    h_size = int(h_img.shape[1]/scale)

    h_structure = cv2.getStructuringElement(cv2.MORPH_RECT,(h_size,1)) # 形態(tài)學(xué)因子
    h_erode_img = cv2.erode(h_img,h_structure,1)

    h_dilate_img = cv2.dilate(h_erode_img,h_structure,1)
    # cv2.imshow("h_erode",h_dilate_img)
    v_size = int(v_img.shape[0] / scale)

    v_structure = cv2.getStructuringElement(cv2.MORPH_RECT, (1, v_size))  # 形態(tài)學(xué)因子
    v_erode_img = cv2.erode(v_img, v_structure, 1)
    v_dilate_img = cv2.dilate(v_erode_img, v_structure, 1)

    mask_img = h_dilate_img+v_dilate_img
    joints_img = cv2.bitwise_and(h_dilate_img,v_dilate_img)
    joints_img = cv2.dilate(joints_img,None,iterations=3)
    cv2.imwrite(os.path.join(save_path, "joints.png"),joints_img)
    cv2.imwrite(os.path.join(save_path, "mask.png"), mask_img)
    return joints_img, mask_img

img = cv2.imread(os.path.join(filepath, filename_clear))
_, mask_img = detectTable(img, save_path=filepath)

投影得到兩張圖,一張表示交叉點(diǎn)的投影,另一張表示表格線的投影,如下圖所示,后續(xù)的邊緣檢測我們將用到右側(cè)的圖。

基于OpenCV-Python的圖像位置校正和版面分析
def find_bound(img):
    
    # 查找圖像中的輪廓
    contours, _ = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_TC89_L1)
    
    # 遍歷所有輪廓
    site = []
    for contour in contours:
        # 計算邊界矩形
        x, y, w, h = cv2.boundingRect(contour)
        if 20 < w < 35 and  20 <h < 35:
            site.append((x, y, w, h),)
    site.sort(key=lambda x: (x[0], x[1], x[2], x[3]))
    return site

site = find_bound(mask_img)

mask.png,使用邊緣檢測,獲取各個邊緣的位置信息,根據(jù)所得的位置信息,在bank-bill-clear.png(對原圖矯正角度并去除背景)中裁剪,并限制裁剪的圖像塊長寬在(20,35)的區(qū)間范圍(實(shí)際嘗試中并不能檢測到金額區(qū)域的完整邊緣,而是金額區(qū)域每個方形的邊緣,(20,35)表示每個方形的長寬區(qū)間范圍,如下圖所示)。

基于OpenCV-Python的圖像位置校正和版面分析
save_path = './task1-result'
if os.path.exists(save_path) is False:
    os.makedirs(save_path)

for i in site:
    x, y, w, h = i
    cv2.imwrite(os.path.join(save_path, f"{x}-{y}-{w}-{h}.png"), img[y:y+h, x:x+w])
(x0, y0, w, h) = site[0]
x, y = x0+(w+2)*11, y0+h*2
cv2.imwrite(os.path.join(save_path, "res.png"), img[y0:y, x0:x])

對裁剪的圖像塊的坐標(biāo)進(jìn)行排序,推測出完整金額的具體位置,并再次裁剪,得到最后結(jié)果

基于OpenCV-Python的圖像位置校正和版面分析

運(yùn)行環(huán)境文章來源地址http://www.zghlxwxcb.cn/news/detail-805266.html

numpy==1.26.2
opencv_contrib_python==4.6.0.66
opencv_python==4.6.0.66
scipy==1.11.4

參考文獻(xiàn)

  1. Python對圖像進(jìn)行傾斜校正
  2. 深入理解OpenCV中的(row,col)和(x,y)
  3. 版面分析那些事

到了這里,關(guān)于基于OpenCV-Python的圖像位置校正和版面分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 在 Python 中使用 OpenCV 通過透視校正轉(zhuǎn)換圖像

    在 Python 中使用 OpenCV 通過透視校正轉(zhuǎn)換圖像

    在計算機(jī)視覺和圖像處理領(lǐng)域,透視變換是一個強(qiáng)大的工具。它允許我們改變圖像的視角以獲得新的視點(diǎn),通常用于校正扭曲或模擬不同的相機(jī)角度。本文將探討一個 Python 腳本,該腳本使用計算機(jī)視覺領(lǐng)域流行的 OpenCV 庫對圖像執(zhí)行透視變換。我們將詳細(xì)介紹該腳本的工作原

    2024年01月25日
    瀏覽(22)
  • 圖像合成——OpenCV-Python圖像融合詳解

    圖像合成——OpenCV-Python圖像融合詳解 在圖像處理中,圖像的合成是一項(xiàng)重要的任務(wù)。OpenCV提供了許多方法來實(shí)現(xiàn)圖像合成。其中,cv::addWeighted()函數(shù)是一種常用的圖像融合方法。它可以將兩張圖片以一定的權(quán)重相加,產(chǎn)生一張新的融合圖像。 下面我們將詳細(xì)講解OpenCV中的c

    2024年02月14日
    瀏覽(21)
  • OpenCv-Python圖像特征識別

    OpenCv-Python圖像特征識別

    本練習(xí)學(xué)習(xí)了OpenCv-Python關(guān)于圖像特征識別的一些算法,算法理解起來較為困難,但函數(shù)用起來上手比較快,主要要明白函數(shù)的輸入輸出的含義。 雖然算法理解不容易,但程序還算有趣,輸入是一個完整的圖片和一組圖片碎片,如下圖,然后經(jīng)過算法計算,把碎片匹配到正確

    2024年02月07日
    瀏覽(83)
  • OpenCV-Python(49):圖像去噪

    OpenCV-Python(49):圖像去噪

    學(xué)習(xí)使用非局部平均值去噪算法去除圖像中的噪音 學(xué)習(xí)函數(shù)cv2.fastNlMeansDenoising()、cv2.fastNlMeansDenoisingColored等 ????????在前面的章節(jié)中我們已經(jīng)學(xué)習(xí)了很多圖像平滑技術(shù),比如高斯平滑、中值平滑等。當(dāng)噪聲比較小時,這些技術(shù)的效果都是很好的。在這些技術(shù)中我們選取像

    2024年01月21日
    瀏覽(48)
  • OpenCV-Python中的圖像基礎(chǔ)操作

    OpenCV-Python中的圖像基礎(chǔ)操作

    首先讀入一副圖像: 獲取像素值及修改的更好方法: img = cv2.imread(‘./resource/image/1.jpg’, cv2.IMREAD_COLOR) img.shape: 圖像的形狀(包括行數(shù),列數(shù),通道數(shù)的元組) img.size : 圖像的像素數(shù)目 img.dtype :圖像的數(shù)據(jù)類型 ROI(regionofinterest),感興趣區(qū)域。機(jī)器視覺、圖像處理中,從被

    2024年02月11日
    瀏覽(24)
  • OpenCV-Python中的圖像處理-圖像直方圖

    OpenCV-Python中的圖像處理-圖像直方圖

    通過直方圖你可以對整幅圖像的灰度分布有一個整體的了解。直方圖的 x 軸是灰度值( 0 到 255), y 軸是圖片中具有同一個灰度的點(diǎn)的數(shù)目。 BINS:上面的直方圖顯示了每個灰度值對應(yīng)的像素數(shù)。如果像素值為 0到255,你就需要 256 個數(shù)來顯示上面的直方圖。但是,如果你不需

    2024年02月12日
    瀏覽(24)
  • opencv-python 將圖像迷宮轉(zhuǎn)為迷宮數(shù)組

    opencv-python 將圖像迷宮轉(zhuǎn)為迷宮數(shù)組

    起因是我想做個自動走迷宮的外掛(其實(shí)是想做點(diǎn)實(shí)踐),所以我需要在游戲中捕捉畫面并自動尋路,然后再控制自動移動,此為第一部分:捕捉畫面。 1.取得圖像迷宮 2.處理圖像 3.圖像分割 4.生成數(shù)組 首先我們得捕捉屏幕畫面,即獲得迷宮圖像,這里我是在steam上面找了一

    2024年02月07日
    瀏覽(39)
  • OpenCV-Python中的圖像處理-視頻分析

    OpenCV-Python中的圖像處理-視頻分析

    學(xué)習(xí)使用 Meanshift 和 Camshift 算法在視頻中找到并跟蹤目標(biāo)對象: Meanshift 算法的基本原理是和很簡單的。假設(shè)我們有一堆點(diǎn)(比如直方 圖反向投影得到的點(diǎn)),和一個小的圓形窗口,我們要完成的任務(wù)就是將這個窗 口移動到最大灰度密度處(或者是點(diǎn)最多的地方)。如下圖所

    2024年02月12日
    瀏覽(24)
  • OpenCV-Python中的圖像處理-模板匹配

    OpenCV-Python中的圖像處理-模板匹配

    使用模板匹配可以在一幅圖像中查找目標(biāo) 函數(shù): cv2.matchTemplate(), cv2.minMaxLoc() 模板匹配是用來在一副大圖中搜尋查找模版圖像位置的方法。 OpenCV 為我們提供了函數(shù): cv2.matchTemplate()。和 2D 卷積一樣,它也是用模板圖像在輸入圖像(大圖)上滑動,并在每一個位置對模板圖像

    2024年02月12日
    瀏覽(23)
  • OpenCV-Python中的圖像處理-霍夫變換

    OpenCV-Python中的圖像處理-霍夫變換

    霍夫(Hough)變換在檢測各種形狀的技術(shù)中非常流行,如果要檢測的形狀可以用數(shù)學(xué)表達(dá)式描述,就可以是使用霍夫變換檢測它。即使要檢測的形狀存在一點(diǎn)破壞或者扭曲也是可以使用。 Hough直線變換,可以檢測一張圖像中的直線 cv2.HoughLines(image, rho, theta, threshold) return:返回值

    2024年02月12日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包