学习之路(二):按照图片内矩形框进行裁剪

学习之路(二):按照图片内矩形框进行裁剪,第1张

OpenCV的使用
  • 前言

  • 一、OpenCV、图片二值化、图片的腐蚀膨胀学习


  • 二、使用

    • 1.引入库
    • 2.读取图片
    • 3.对图片进行腐蚀
    • 4.获取矩形框
    • 5.对图片进行裁剪
    • 完整代码

  • 三、最终效果

前言

最近老师给了我一些图片,让我按照每张图片内的矩形框进行截图,图片量不是很大,但是自己有点懒,不想用PS去一张一张的截图,于是就去学习了一下OpenCV的使用,用代码进行截图




一、OpenCV、图片二值化、图片的腐蚀膨胀学习

还是不做过多赘述,我也是看着他人的博客学习的,以下是我看的文章的链接:

  1. opencv-python 函数总览(初版)
  2. OpenCV–Python
  3. 图像腐蚀与图像膨胀(Python篇)

二、使用 1.引入库

from unittest import result
import cv2
import os
import numpy as np
2.读取图片
path = r"D:\Desktop\threrteen\page01.jpg"
img = cv2.imread(path,cv2.IMREAD_UNCHANGED)#我这里读取的是完整图片,因为老师给我的图片就是两通道的图片
result = img.copy()
Sp = img.shape
print(Sp)

OpenCV读取图片时,路径中不能有中文字符


3.对图片进行腐蚀
#img = cv2.imread(pic,cv2.IMREAD_UNCHANGED)
kernel = np.ones((7,7),np.uint8)#设置卷积核
erosion = cv2.erode(img,kernel)

第一步是对图片进行二值化处理,如果读取的图片不是两通道的图片需要这一步


4.获取矩形框
ret, thresh = cv2.threshold(img,20,200,cv2.THRESH_BINARY_INV)#这一步一个可以不要,是对图片进行二值化的,毕竟在腐蚀的时候就已经二值化了
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,1))#因为是根据矩形框进行截图,所以设置内核为矩形以及锚点的位置(不同的图片锚点位置不同,可以定义一个Mat函数获取)
eroded = cv2.erode(thresh,kernel)#腐蚀.....
contours, hierarchy = cv2.findContours(eroded,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)


5.对图片进行裁剪
count = 0
color = (0,255,0)#设置绘制矩形框的RGB通道
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
    if w >2000 and h>3000:
        print(w,h)
        cv2.rectangle(img, (x, y), (x + w, y + h), color, 1)#在图像上绘制一个矩形,根据绘制的矩形框进行切割
        count += 1
        temp = result[y:(y + h), x:(x + w)]
        # temp = cv2.bitwise_not(temp)#取反
        temp = cv2.resize(temp,(768,1024))#将图片统一保存为1024*768的大小
        cv2.imwrite(r"D:\Desktop\result\page{0}.jpg".format(count),temp)

第四步中获取图片中的矩形框时,会对所有的矩形框以及腐蚀后卫矩形框的位置都进行识别,例如文字“口”“品”都会被识别为矩形框,这时候就应该避免这种小的矩形框被裁剪,我第一次的时候就没有注意,把画矩形框和保存图片放在了循环外,还傻乎乎的运行了五分钟,删除图片的时候内心是崩溃的。



完整代码
from unittest import result
import cv2
import os
import numpy as np

path = r"D:\Desktop\threrteen\page01.jpg"
img = cv2.imread(path,cv2.IMREAD_UNCHANGED)
result = img.copy()
Sp = img.shape
#print(Sp)

b = bytes()

kernel = np.ones((7,7),np.uint8)
erosion = cv2.erode(img,kernel)

ret, thresh = cv2.threshold(img,20,200,cv2.THRESH_BINARY_INV)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,1))
eroded = cv2.erode(thresh,kernel)

dict = {}
list = []
contours, hierarchy = cv2.findContours(eroded,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
count = 0
color = (0,255,0)
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
    if w >2000 and h>3000:
        print(w,h)
        cv2.rectangle(img, (x, y), (x + w, y + h), color, 1)
        count += 1

        temp = result[y:(y + h), x:(x + w)]
        # temp = cv2.bitwise_not(temp)#取反
        temp = cv2.resize(temp,(768,1024))
        cv2.imwrite(r"D:\Desktop\result\page{0}.jpg".format(count),temp)


三、最终效果

emmmmm,图片是老师给的,我也不知道可不可以发出来,就画了一下,不过不影响代码效果的演示
原图:

结果:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/569491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存