图片矫正

import cv2 # python 做一个全能扫描王.
import numpy as np
img = cv2.imread('1.png')
h=640
w=480
img = cv2.resize(img, (480, 640))[...,::-1]# RESIZE IMAGE
img_blur = cv2.GaussianBlur(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY), (5, 5), 1)# 添加高斯模糊
img_edges = cv2.Canny(img_blur, 100, 200)# 寻找边缘
# 先膨胀后腐蚀的操作,去除图像中的黑点.
kernel = np.ones((5, 5))
img_dilate = cv2.dilate(img_edges, kernel, iterations=2)# 膨胀
img_erode = cv2.erode(img_dilate, kernel, iterations=1) # 腐蚀
img_counter = img.copy() # 拷贝图片
contours, hierarchy = cv2.findContours(img_erode, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 寻找轮廓
                                          


def biggestContour( contours):
    biggest = np.array([])
    max_area = 0
    for i in contours:
        area = cv2.contourArea(i)  # 计算轮廓的面积
        if area > 5000:  # 如果面积大于5000
            peri = cv2.arcLength(i, True)  # 计算轮廓的周长
            approx = cv2.approxPolyDP(i, 0.02 * peri, True)  # 角点检测
            if area > max_area and len(approx) == 4:  # 如果逼近的多边形为矩形,且面积最大
                biggest = approx  # 数值点
                max_area = area
    return biggest, max_area

biggest, max_area = biggestContour(contours)

if biggest.size != 0:
    biggest = biggest.reshape((4, 2))
    cv2.drawContours(img_counter, [biggest], -1, (255, 0, 0), 10)
    cv2.imwrite('counter.png', img_counter)
    # img_counter = drawRectangle(img_counter, biggest)  # 在图片上画出矩形框
    points1 = np.float32(biggest)# 将坐标点转化为浮点数

    # reorder points
    f1=[0,0]
    f2=[w,0]
    f3=[0,h]
    f4=[w,h]
    juli=999999
    b1=[0,0]
    for i in points1:
        if np.linalg.norm(i-f1)<juli:
            b1=i
            juli=np.linalg.norm(i-f1)

    juli=999999
    b2=[0,0]
    for i in points1:
        if np.linalg.norm(i-f2)<juli:
            b2=i
            juli=np.linalg.norm(i-f2)


    juli=999999
    b3=[0,0]
    for i in points1:
        if np.linalg.norm(i-f3)<juli:
            b3=i
            juli=np.linalg.norm(i-f3)


    juli=999999
    b4=[0,0]
    for i in points1:
        if np.linalg.norm(i-f4)<juli:
            b4=i
            juli=np.linalg.norm(i-f4)

    points1=np.array([b1,b2,b3,b4])


    points2 = np.float32([[0, 0], [480, 0], [0, 640], [480, 640]])# 图像为(480,640)的上下左右有四个坐标
    matrix = cv2.getPerspectiveTransform(points1, points2)  # 生成变换矩阵
    img_warpcolor = cv2.warpPerspective(img, matrix, (480, 640))  # 利用进行透视变换
    cv2.imwrite('warp.png', img_warpcolor)
else:
    print('未找到矩形')

1

counter

warp

posted on 2025-12-03 14:39  张博的博客  阅读(6)  评论(0)    收藏  举报

导航