Python Opencv實(shí)戰(zhàn)之印章提取的實(shí)現(xiàn)
前言
這期分享的是使用opencv提取印章,很多時(shí)候我們需要電子版的章,所以今天就帶大家使用代碼提取出來(lái)!
Photoshop雖然強(qiáng)大,但是奈何小編不會(huì)使啊,昨天就有一個(gè)小伙伴問(wèn)我能不能幫忙,這不?
PS雖然我不會(huì),但是我會(huì)寫(xiě)代碼呀!這可難不倒我!安排安排~
(特別提醒:所有愛(ài)好設(shè)計(jì)和喜歡做圖的小伙伴們,切記千萬(wàn)不要幫著老板或者朋友PS偽造公章,刑法第280條特別指出,偽造證件印章,是可以追究刑事責(zé)任的,違法的事情不要做哦。)
源碼展示
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): """ 統(tǒng)一圖片的大小 :return:返回一張未處理的目標(biāo)圖片 """ 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) # 處理圖像色調(diào) low_range = np.array([130, 43, 46]) # 設(shè)下邊界 high_range = np.array([180, 255, 255]) # 設(shè)上邊界 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): """ 邊緣檢測(cè),截取并輸出結(jié)果 :return: """ imgreal = self.img_enhance() # 擴(kuò)充圖片防止截取部分 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.CHAIN_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()
效果展示
原圖
效果圖
到此這篇關(guān)于Python Opencv實(shí)戰(zhàn)之印章提取的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python Opencv印章提取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python通過(guò)微信發(fā)送郵件實(shí)現(xiàn)電腦關(guān)機(jī)
這篇文章主要為大家詳細(xì)介紹了python通過(guò)微信發(fā)送郵件實(shí)現(xiàn)電腦關(guān)機(jī),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Pandas根據(jù)條件實(shí)現(xiàn)替換列中的值
在使用Pandas的Python中,DataFrame列中的值可以通過(guò)使用各種內(nèi)置函數(shù)根據(jù)條件進(jìn)行替換,本文主要來(lái)和大家討論在Pandas中用條件替換數(shù)據(jù)集列中的值的各種方法,希望對(duì)大家有所幫助2024-01-01Python下使用Trackbar實(shí)現(xiàn)繪圖板
這篇文章主要為大家詳細(xì)介紹了Python下使用Trackbar實(shí)現(xiàn)繪圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Python中os.path模塊的8個(gè)神奇函數(shù)分享
在Python編程中,os.path模塊是一個(gè)非常重要的模塊,它提供了用于處理文件路徑和目錄的函數(shù),本文將介紹os.path模塊中最常用的8個(gè)內(nèi)置函數(shù),需要的可以參考下2023-11-11Python?Prim算法通過(guò)遍歷墻實(shí)現(xiàn)迷宮的生成
之前,我們?cè)诹硗庖黄恼轮惺褂肞rim算法生成了一個(gè)完美迷宮,利用的是遍歷網(wǎng)格的方法,這一次,我們要教教大家用遍歷墻的方法生成,感興趣的可以收藏一下2023-01-01對(duì)python特殊函數(shù) __call__()的使用詳解
今天小編就為大家分享一篇對(duì)python特殊函數(shù) __call__()的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07使用Python matplotlib作圖時(shí),設(shè)置橫縱坐標(biāo)軸數(shù)值以百分比(%)顯示
這篇文章主要介紹了使用Python matplotlib作圖時(shí),設(shè)置橫縱坐標(biāo)軸數(shù)值以百分比(%)顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05python 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線性回歸案例
這篇文章主要介紹了python 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線性回歸案例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12Python調(diào)用Google?Bard的圖文詳解
Google?Bard?是一種開(kāi)源數(shù)據(jù)可視化和探索工具,可為?開(kāi)發(fā)人員?提供支持,本文主要為大家介紹了Python調(diào)用Google?Bard的方法,需要的可以參考下2023-08-08