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

OpenCV實戰(zhàn)之三 | 基于OpenCV實現(xiàn)圖像校正

這篇具有很好參考價值的文章主要介紹了OpenCV實戰(zhàn)之三 | 基于OpenCV實現(xiàn)圖像校正。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在機器視覺中,對于圖像存在ROI區(qū)域傾斜現(xiàn)象,我們需要將其校正為正確的角度視角,方便下一步的布局分析與文字識別,通過透視變換可以取得比較好的裁剪效果。

一、基于輪廓提取和透射變換

? 基于輪廓提取和透射變換的矯正算法更適用于車牌、身份證人民幣、書本發(fā)票一類矩形形狀而且邊界明顯的物體矯正。

算法步驟

  1. 圖片灰度化
  2. 二值化/canny邊緣檢測等操作
  3. 檢測輪廓,并篩選出目標(biāo)輪廓(通過橫縱比或面積去除干擾輪廓)
  4. 獲取圖像頂點
  5. 透視變換

實現(xiàn)代碼

import cv2
import numpy as np

def contour_to_rect(contour):
    pts = contour.reshape(4, 2)
    print(pts)
    rect = np.zeros((4, 2), dtype = "float32")
    # top-left point has the smallest sum
    # bottom-right has the largest sum
    s = pts.sum(axis = 1)
#     print(s)
    rect[0] = pts[np.argmin(s)]
#     print(pts[np.argmin(s)])
    rect[2] = pts[np.argmax(s)]
    # compute the difference between the points:
    # the top-right will have the minumum difference
    # the bottom-left will have the maximum difference
    diff = np.diff(pts, axis = 1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]
    return rect

# approximate the contour by a more primitive polygon shape
def approximate_contour(contour):
    peri = cv2.arcLength(contour, True)
    return cv2.approxPolyDP(contour, 0.032 * peri, True)

# 獲取頂點坐標(biāo)
def get_receipt_contour(contours):
    # loop over the contours
    for c in contours:
        approx = approximate_contour(c)
        # if our approximated contour has four points, we can assume it is receipt's rectangle
        if len(approx) == 4:
            return approx


def wrap_perspective(img, rect):
    # unpack rectangle points: top left, top right, bottom right, bottom left
    (tl, tr, br, bl) = rect
    # compute the width of the new image
    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))
    # compute the height of the new image
    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))
    # take the maximum of the width and height values to reach
    # our final dimensions
    maxWidth = max(int(widthA), int(widthB))
    maxHeight = max(int(heightA), int(heightB))
    # destination points which will be used to map the screen to a "scanned" view
    dst = np.array([
        [0, 0],
        [maxWidth - 1, 0],
        [maxWidth - 1, maxHeight - 1],
        [0, maxHeight - 1]], dtype = "float32")
    # calculate the perspective transform matrix
    M = cv2.getPerspectiveTransform(rect, dst)
    # warp the perspective to grab the screen
    return cv2.warpPerspective(img, M, (maxWidth, maxHeight))


if __name__ == "__main__":
    img = cv2.imread("./images/1.png")
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 用高斯濾波處理原圖像降噪
    blur = cv2.GaussianBlur(gray, (5, 5), 0)
	#canny邊緣檢測(僅針對這次的輸入圖片)
    edged = cv2.Canny(blur, 50, 150)
    contours, h = cv2.findContours(edged.copy(), mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_SIMPLE)
    # img_contours = cv2.drawContours(img.copy(), contours, -1, (0, 0, 255), 3)

    largest_contours = sorted(contours, key=cv2.contourArea, reverse=True)[:5]
    # img_largest_contours = cv2.drawContours( img.copy(), largest_contours, -1, (0, 0, 255), 3)

    receipt_contour = get_receipt_contour(largest_contours)
    # img_receipt_contour = cv2.drawContours(img.copy(), [receipt_contour], -1, (0, 0, 255), 3)

    ori_img = img.copy()
    for coor in contour_to_rect(receipt_contour):
        cv2.circle(ori_img, (int(coor[0]), int(coor[1])), 1, (0, 0, 255), 4)
	# 進(jìn)行透視變換
    scanned = wrap_perspective(img.copy(), contour_to_rect(receipt_contour))
opencv中仿射變換矯正圖像,OpenCV實戰(zhàn)筆記,opencv,人工智能,計算機視覺opencv中仿射變換矯正圖像,OpenCV實戰(zhàn)筆記,opencv,人工智能,計算機視覺opencv中仿射變換矯正圖像,OpenCV實戰(zhàn)筆記,opencv,人工智能,計算機視覺

最終效果

opencv中仿射變換矯正圖像,OpenCV實戰(zhàn)筆記,opencv,人工智能,計算機視覺

二、基于霍夫直線探測和仿射變換

? 基于霍夫直線探測的矯正算法更適用于文本類等無明顯邊界圖像的矯正。文章來源地址http://www.zghlxwxcb.cn/news/detail-774964.html

算法步驟

  1. 霍夫線變換探測出圖像中的所有直線。
  2. 計算出每條直線的傾斜角,求他們的平均值。
  3. 根據(jù)傾斜角旋轉(zhuǎn)矯正。
  4. 最后根據(jù)文本尺寸裁剪圖片。

實現(xiàn)代碼

import cv2
import numpy as np


img = cv2.imread("./images/4.jpg")
src = img.copy()
gray = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY);
edged = cv2.Canny(src, 50, 200, apertureSize=3);

# 第5個參數(shù)就是閾值,閾值越大,檢測精度越高
plines = cv2.HoughLines(edged, 1, np.pi / 180, 200);
if plines is not None:
    plines = plines.reshape(-1, 2)
    print(len(plines), "lines detected")

    sum_theta = 0.0
    for rho, theta in plines:
        # rho, theta = line[0]
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        x1 = int(x0 + 1000*(-b))
        y1 = int(y0 + 1000*(a))
        x2 = int(x0 - 1000*(-b))
        y2 = int(y0 - 1000*(a))
        sum_theta += theta
        # 繪制直線
        cv2.line(src, (x1, y1), (x2, y2), (0, 0, 255), 2)

# 計算平均角度
average_theta = sum_theta / len(plines)
angle = np.degrees(average_theta) - 90

# 計算旋轉(zhuǎn)中心
center = (float(img.shape[1] / 2.0), float(img.shape[0] / 2.0))
# 計算對角線長度作為旋轉(zhuǎn)后圖像的尺寸
length = int(np.sqrt(img.shape[0]**2 + img.shape[1]**2))
# 計算旋轉(zhuǎn)矩陣
M = cv2.getRotationMatrix2D(center, angle, 1)
# 進(jìn)行仿射變換并填充背景色為白色
src_rotate = cv2.warpAffine(img, M, (length, length), borderValue=(255, 255, 255))

最終效果

opencv中仿射變換矯正圖像,OpenCV實戰(zhàn)筆記,opencv,人工智能,計算機視覺opencv中仿射變換矯正圖像,OpenCV實戰(zhàn)筆記,opencv,人工智能,計算機視覺

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

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

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

相關(guān)文章

  • OpenCV(十一):圖像仿射變換

    OpenCV(十一):圖像仿射變換

    目錄 1.圖像仿射變換介紹 ?仿射變換: 仿射變換矩陣: 仿射變換公式: 2.仿射變換函數(shù) 仿射變換函數(shù):warpAffine() 圖像旋轉(zhuǎn):getRotationMatrix2D() 計算仿射變換矩陣:getAffineTransform()? 3.demo 1.圖像仿射變換介紹 ?仿射變換: ? ? ? ?仿射變換是由平移、縮放、旋轉(zhuǎn)、翻轉(zhuǎn)和錯切組

    2024年02月10日
    瀏覽(90)
  • 【OpenCV ? c++】圖像幾何變換 | 圖像仿射變換

    【OpenCV ? c++】圖像幾何變換 | 圖像仿射變換

    ?? 個人簡介:CSDN「 博客新星 」TOP 10 , C/C++ 領(lǐng)域新星創(chuàng)作者 ?? 作 ?? 者: 錫蘭_CC ?? ?? 專 ?? 欄: 【OpenCV ? c++】計算機視覺 ?? 若有幫助,還請 關(guān)注?點贊?收藏 ,不行的話我再努努力??????

    2024年02月16日
    瀏覽(92)
  • 【OpenCV】圖像變換(縮放、平移、旋轉(zhuǎn)、仿射)

    圖像變換是指通過對圖像進(jìn)行縮放、平移、旋轉(zhuǎn)、仿射、透視等變換來改變圖像的形狀和大小。在本篇博客中,我們將詳細(xì)介紹OpenCV中的圖像變換函數(shù),并提供示例代碼以幫助讀者更好地理解這些函數(shù)的使用方法。 縮放變換是指通過改變圖像的大小來改變圖像的形狀。在Op

    2024年02月07日
    瀏覽(95)
  • OpenCV圖像的仿射變換、旋轉(zhuǎn)和縮放

    OpenCV圖像的仿射變換、旋轉(zhuǎn)和縮放

    以下是對代碼的逐行解釋:

    2024年02月13日
    瀏覽(86)
  • opencv校正圖像

    opencv校正圖像

    我們用相機拍照時,會因為角度問題造成拍歪,會影響圖像的識別,這時就需要對圖像進(jìn)行校正,下面介紹校正圖像的一種方式,可以用來校正簡單的圖像,如文字信息、工件等。 校正的過程可以分為以下幾步: 1、轉(zhuǎn)灰度圖。 2、降噪。 3、Canny邊緣檢測。 4、膨脹。 5、輪廓

    2024年02月12日
    瀏覽(17)
  • opencv圖像仿射變換,cv2.warpAffine

    opencv圖像仿射變換,cv2.warpAffine

    目錄 仿射變換原理介紹 cv2.warpAffine函數(shù)介紹 代碼實例? ? ? ? ? 仿射變換 ,又稱 仿射映射 ,是指在幾何中,一個向量空間進(jìn)行一次線性變換并接上一個平移,變換為另一個向量空間。 ????????在有限維的情況,每個仿射變換可以由一個矩陣A和一個向量b給出,它可以寫

    2024年02月05日
    瀏覽(96)
  • OpenCV庫進(jìn)行圖像旋轉(zhuǎn)、仿射變換和透視變換
  • opencv006圖像處理之仿射變換(旋轉(zhuǎn),縮放,平移)

    opencv006圖像處理之仿射變換(旋轉(zhuǎn),縮放,平移)

    空間變換中的仿射變換對應(yīng)著五種變換,平移,縮放,旋轉(zhuǎn),翻轉(zhuǎn),錯切。而這五種變化由原圖像轉(zhuǎn)變到變換圖像的過程,可以用仿射變換矩陣進(jìn)行描述。而這個變換過程可以用一個2*3的矩陣與原圖進(jìn)行相乘得到。關(guān)鍵就是這個矩陣M: ?平移,旋轉(zhuǎn)? ?透視 M: 變換矩陣 desi

    2024年01月21日
    瀏覽(95)
  • 【C++ OpenCV】圖像變換:連接、尺寸、翻轉(zhuǎn)、旋轉(zhuǎn)、仿射變換

    【C++ OpenCV】圖像變換:連接、尺寸、翻轉(zhuǎn)、旋轉(zhuǎn)、仿射變換

    目錄 圖像縮放變換 圖像翻轉(zhuǎn) 圖像拼接 縱向拼接 橫向拼接 圖像插值原理 作用 單線性插值 雙線性插值的公式 雙線性插值的例子 雙線性插值的直觀展示 意義 仿射變換 圖像旋轉(zhuǎn) 實操 一、實現(xiàn)圖像旋轉(zhuǎn) 二、根據(jù)定義的三個點實現(xiàn)仿射變換,并且求取仿射變換矩陣 源碼 src -

    2024年01月18日
    瀏覽(1257)
  • OpenCV項目開發(fā)實戰(zhàn)--基于Python/C++實現(xiàn)鼠標(biāo)注釋圖像和軌跡欄來控制圖像大小

    OpenCV項目開發(fā)實戰(zhàn)--基于Python/C++實現(xiàn)鼠標(biāo)注釋圖像和軌跡欄來控制圖像大小

    鼠標(biāo)指針是圖形用戶界面 (GUI) 中的關(guān)鍵組件。沒有它,您就無法真正考慮與 GUI 進(jìn)行交互。那么,讓我們深入了解 OpenCV 中鼠標(biāo)和軌跡欄的內(nèi)置函數(shù)。我們將演示如何使用鼠標(biāo)來注釋圖像,以及如何使用軌跡欄來控制圖像的大小 我們將使用下圖來演示 OpenCV 中鼠標(biāo)指針和軌跡

    2024年02月11日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包