【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)

前言

🚀作者:《程序员梨》

🚀 **文章简介 **:本篇文章主要是写了opencv的提取印章文字小程序!

🚀 **文章源码免费提供:为了感谢所有关注我的人💓 每篇文章的项目源码都是免费的

分享有偿💓👇👇👇👇

点这里领取蓝线字体,记得提你需要的源代码的标题名称!也可以私信我!

🚀 欢迎朋友点赞👍、收藏⭐、评论💬

【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)

文本

【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)

这期分享的是使用opencv提取印章,很多时候我们需要电子版的章,所以今天就带大家使用代码

提取它!

Photoshop虽然强大,但是奈何小编不会使啊,昨天就有一个小伙伴问我能不能帮忙,这不?PS虽

我当然不能,但我可以写代码!这不打扰我!安排安排~

(特别提醒:所有爱好设计和喜欢做图的小伙伴们,切记千万不要帮着老板或者朋友PS伪造公

章,刑法第280条特别指出,伪造证件印章,是可以追究刑事责任的,违法的事情不要做哦。)

教程送上👇,源码在文末或上文中蓝色字体免费——加油!

【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)

1)效果展示

原图——

【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)

渲染——

【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)

2)源码展示

import cv2
import numpy as np

class Seal:
    def __init__(self, img_path):
        """
        初始化图片
        :param img_path: 原始图片路径        """
        self.image = cv2.imread(img_path)
        self.img_shape = self.image.shape
        self.file_name = img_path.split('.')[0].split('\\')[-1]

    def unify_img_size(self):
        """
        统一图片的大小
        :return:返回一张未处理的目标图片        """
        img_w = 650 if self.img_shape[1] > 600 else 400
        self.image = cv2.resize(self.image, (img_w, int(img_w * self.img_shape[0] / self.img_shape[1])), interpolation=cv2.IMREAD_COLOR)
        impng = cv2.cvtColor(self.image.copy(), cv2.COLOR_RGB2RGBA)
        return impng

    def img_binaryzation(self,hue_image, low_range, high_range, imgpng):

        th = cv2.inRange(hue_image, low_range, high_range)
        element = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1))
        th = cv2.dilate(th, element)
        index1 = th == 255
        print_img = np.zeros(imgpng.shape, np.uint8)
        print_img[:, :, :] = (255, 255, 255, 0)
        print_img[index1] = imgpng[index1]  # (0,0,255)
        return print_img

    def img_enhance(self):
        imgpng = self.unify_img_size()
        hue_image = cv2.cvtColor(self.image, cv2.COLOR_BGR2HSV)  # 处理图像色调
        low_range = np.array([130, 43, 46])  # 设下边界
        high_range = np.array([180, 255, 255])  # 设上边界
        print1 = self.img_binaryzation(hue_image, low_range, high_range, imgpng)
        low_range = np.array([0, 43, 46])
        high_range = np.array([9, 255, 255])
        print2 = self.img_binaryzation(hue_image, low_range, high_range, imgpng)
        imgreal = cv2.add(print2, print1)

        white_px = np.asarray([255, 255, 255, 255])
        (row, col, _) = imgreal.shape
        for r in range(row):
            for c in range(col):
                px = imgreal[r][c]
                if all(px == white_px):
                    imgreal[r][c] = imgpng[r][c]
        return imgreal

    def extension_img(self):
        """
        边缘目标检测,截取并输出结果
        :return:
        """
        imgreal = self.img_enhance()
        # 扩充图片防止截取部分
        print4 = cv2.copyMakeBorder(imgreal, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[255, 255, 255, 0])
        print2gray = cv2.cvtColor(print4, cv2.COLOR_RGBA2GRAY)
        _, grayfirst = cv2.threshold(print2gray, 254, 255, cv2.THRESH_BINARY_INV)

        element = cv2.getStructuringElement(cv2.MORPH_RECT, (22, 22))
        img6 = cv2.dilate(grayfirst, element)

        c_canny_img = cv2.Canny(img6, 10, 10)

        contours, hierarchy = cv2.findContours(c_canny_img, cv2.RETR_EXTERNAL, cv2.CHAI(人工智能(Artificial Intelligence))N_APPROX_NONE)
        areas = []
        for i, cnt in enumerate(contours):
            x, y, w, h = cv2.boundingRect(cnt)
            area = w * h
            ars = [area, i]
            areas.append(ars)
        areas = sorted(areas, reverse=True)
        maxares = areas[:1]

        x, y, w, h = cv2.boundingRect(contours[maxares[0][1]])
        print5 = print4[y:(y + h), x:(x + w)]
        # 高小于宽
        if print5.shape[0] < print5.shape[1]:
            zh = int((print5.shape[1] - print5.shape[0]) / 2)
            print5 = cv2.copyMakeBorder(print5, zh, zh, 0, 0, cv2.BORDER_CONSTANT, value=[255, 255, 255, 0])
        else:
            zh = int((print5.shape[0] - print5.shape[1]) / 2)
            print5 = cv2.copyMakeBorder(print5, 0, 0, zh, zh, cv2.BORDER_CONSTANT, value=[255, 255, 255, 0])
        resultprint = cv2.resize(print5, (150, 150))

        cv2.imwrite(r'output\{}_result.png'.format(self.file_name), resultprint)


if __name__ == '__main__':
    s = Seal(r"src\2.jpg")
    s.extension_img()

总结

效果很不错,有兴趣的朋友可以试试~

关注我们获取更多精彩内容!记得点击传送门👇

记得加三倍!如需打包源代码+素材免费分享! !门户网站

【Opencv实战】这个印章“神器”够牛,节省了时间提高了效率,厉害~(附完整源码)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2022年3月25日
下一篇 2022年3月25日

相关推荐