python使用opencv切割圖片白邊
發(fā)布日期:2022-01-26 13:24 | 文章來(lái)源:CSDN
本文實(shí)例為大家分享了python使用opencv切割圖片白邊的具體代碼,可以橫切和豎切,供大家參考,具體內(nèi)容如下
廢話不多說(shuō)直接上碼,分享使人進(jìn)步:
from PIL import Image from itertools import groupby import cv2 import datetime import os # from core.rabbitmq import MessageQueue THRESHOLD_VALUE = 230 # 二值化時(shí)的閾值 PRETREATMENT_FILE = 'hq' # 橫切時(shí)臨時(shí)保存的文件夾 W = 540 # 最小寬度 H = 960 # 最小高度 class Pretreatment(object): __doc__ = "圖片橫向切割" def __init__(self, path, save_path, min_size=960): self.x = 0 self.y = 0 self.img_section = [] self.continuity_position = [] self.path = path self.save_path = save_path self.img_obj = None self.min_size = min_size self.mkdir(self.save_path) self.file_name = self.path.split('/')[-1] def get_continuity_position_new(self): img = cv2.imread(self.path) gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh1 = cv2.threshold(gray_image, THRESHOLD_VALUE, 255, cv2.THRESH_BINARY) width = img.shape[1] height = img.shape[0] self.x = width self.y = height for i in range(0, height): if thresh1[i].sum() != 255 * width: self.continuity_position.append(i) def filter_rule(self): if self.y < self.min_size: return True def mkdir(self, path): if not os.path.exists(path): os.makedirs(path) def get_section(self): # 獲取區(qū)間 for k, g in groupby(enumerate(self.continuity_position), lambda x: x[1] - x[0]): l1 = [j for i, j in g] # 連續(xù)數(shù)字的列表 if len(l1) > 1: self.img_section.append([min(l1), max(l1)]) def split_img(self): print(self.img_section) for k, s in enumerate(self.img_section): if s: if not self.img_obj: self.img_obj = Image.open(self.path) if self.x < W: return if s[1] - s[0] < H: return cropped = self.img_obj.crop((0, s[0], self.x, s[1])) # (left, upper, right, lower) self.mkdir(os.path.join(self.save_path, PRETREATMENT_FILE)) cropped.save(os.path.join(self.save_path, PRETREATMENT_FILE, f"hq_{k}_{self.file_name}")) def remove_raw_data(self): os.remove(self.path) def main(self): # v2 try: self.get_continuity_position_new() self.filter_rule() self.get_section() self.split_img() except Exception as e: print(self.file_name) print(e) finally: if self.img_obj: self.img_obj.close() class Longitudinal(Pretreatment): def get_continuity_position_new(self): print(self.path) img = cv2.imread(self.path) gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh1 = cv2.threshold(gray_image, THRESHOLD_VALUE, 255, cv2.THRESH_BINARY) width = img.shape[1] height = img.shape[0] print(width, height) self.x = width self.y = height for i in range(0, width): if thresh1[:, i].sum() != 255 * height: self.continuity_position.append(i) def split_img(self): print(self.img_section) for k, s in enumerate(self.img_section): if s: if not self.img_obj: self.img_obj = Image.open(self.path) if self.y < H: return if s[1] - s[0] < W: return cropped = self.img_obj.crop((s[0], 0, s[1], self.y)) # (left, upper, right, lower) cropped.save(os.path.join(self.save_path, f"{k}_{self.file_name}")) def main(path, save_path): starttime = datetime.datetime.now() a = Pretreatment(path=path, save_path=save_path) a.main() for root, dirs, files in os.walk(os.path.join(save_path, PRETREATMENT_FILE)): for i in files: b = Longitudinal(path=os.path.join(save_path, PRETREATMENT_FILE, i), save_path=save_path) b.main() os.remove(os.path.join(save_path, PRETREATMENT_FILE, i)) endtime = datetime.datetime.now() print(f'耗時(shí):{(endtime - starttime)}') if __name__ == '__main__': path = '你圖片存放的路徑' save_path = '要保存的路徑' for _, _, files in os.walk(path): for i in files: main(path=os.path.join(path, i), save_path=save_path) os.rmdir(os.path.join(save_path, PRETREATMENT_FILE))
原始圖片:
結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持本站。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章