- 前言
一、OpenCV、图片二值化、图片的腐蚀膨胀学习
二、使用
- 1.引入库
- 2.读取图片
- 3.对图片进行腐蚀
- 4.获取矩形框
- 5.对图片进行裁剪
- 完整代码
三、最终效果
最近老师给了我一些图片,让我按照每张图片内的矩形框进行截图,图片量不是很大,但是自己有点懒,不想用PS去一张一张的截图,于是就去学习了一下OpenCV的使用,用代码进行截图。
一、OpenCV、图片二值化、图片的腐蚀膨胀学习
还是不做过多赘述,我也是看着他人的博客学习的,以下是我看的文章的链接:
- opencv-python 函数总览(初版)
- OpenCV–Python
- 图像腐蚀与图像膨胀(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,图片是老师给的,我也不知道可不可以发出来,就画了一下,不过不影响代码效果的演示
原图:
结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)