功能说明
利用阈值分割,进行截取roi区域并保存到文件夹
小姐姐就喜欢你这样努力学习的样子!
代码实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/06/23
# @Author : Wupke
# Purpose: 利用阈值分割,批量截取roi区域并保存
import cv2
import os
import copy
import numpy as np
file_dir = "E:\Desktop\\text_roi_cut\\test_cut\\" # 图片读入路径
roi_save_path ="E:\Desktop\\text_roi_cut\\test_cut\\roi_cut\\" # roi 存放路径
def roi_cut():
for root, dirs, files in os.walk(file_dir):
# root 所指的是当前正在遍历的这个文件夹的本身的地址
# dirs 是一个 list,内容是该文件夹中所有的目录的名字(不包括子目录)
# files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
for file in files: # 遍历文件见中的图片
myimage = cv2.imread(file_dir + file) # 以路径+文件名,读入初始图片
# print(file_dir + file)
resize = myimage.shape
#image.shape
#myimage.shape[0][1][2],依次为图像的垂直方向像素值,水平方向像素值,通道数
# print(resize[1])
myimage1 = copy.deepcopy(myimage) # 深层复制
gray = cv2.cvtColor(myimage, cv2.COLOR_BGR2GRAY) # 转灰度图
ret, binary = cv2.threshold(gray, 30, 255, 0) # 自适应二值化
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE); # 查找所有轮廓,每个轮廓信息保存于contours数组中
img = cv2.drawContours(myimage, contours, -1, (0, 255, 0), 1, 8); # 绘制轮廓线或填充轮廓线,在二进制图像中检索连接组件并给它们贴上标签
test_point = (resize[1]*4/5, resize[0]/2)
# print(test_point)
# counter = 0
# ROI和原图进行与运算,筛出原图中的ROI区域
for i in range(len(contours)-1):
area = cv2.contourArea(contours[i]) # 感兴趣区轮廓部分的起点和终点,默认计算整个轮廓的面积
flag = cv2.pointPolygonTest(contours[i], test_point, False) # 轮廓对比
# print(flag)
if area > 15000 and flag==1:
# counter = counter + 1
# print(contours[i])
# print(area)
contour = contours[i]
bounding_box = cv2.boundingRect(contour) # 计算轮廓的垂直边界最小矩形,矩形是与图像上下边界平行的
[x, y, w, h] = bounding_box
# print(counter)
# 截取roi并保存
myimage2 = myimage1[y:y + h, x:x + w]
if not os.path.exists(roi_save_path):
os.mkdir(roi_save_path)
cv2.imwrite(roi_save_path + file, myimage2)
# cv2.imshow("Hello", myimage2)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
if __name__ == "__main__":
test = roi_cut()
效果展示
原图
截取的roi 区域
保存
知识补充点
① #!/usr/bin/env python 与 #!/usr/bin/python
脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它.
#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
#!/usr/bin/python相当于写死了python路径;
#!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法
② flag ==1
flag作为if的判断条件,原值为0,当满足while里的if语句,flag=1,即为找到x满足if语句的条件,然后跳出循环,
flag作为一个标识,如果找到了满足条件的x,那么在下面的if-else语句中将输出正确的x,否则表示没找到
Reference
https://blog.csdn.net/achacuo3822/article/details/101714431
https://blog.csdn.net/weixin_42251888/article/details/112036770