使用OpenCV-Python实现灰度化、二值化等基本处理
立即下载
资源介绍:
对OpenCV、图像处理方法进行简介与操作介绍,实现了对文件夹中每个手写图像进行灰度化、二值化、膨胀和连通组件分析的基本流程并包含了错误处理和文件过滤
#处理一个包含手写图像的文件夹,对每个图像进行灰度化、二值化、膨胀 图像处理操作,
# 并使用连通组件分析来识别和标记小于一定面积的区域
import cv2 as cv # 导入OpenCV库,并简称为cv
import numpy as np # 导入NumPy库,用于数学运算和数组操作
import os # 导入os库,用于处理文件和目录
# 设置原始图像文件夹路径
orig_path = r"D:\Blog\work2\Picture"
img_list = [f for f in os.listdir(orig_path) if
f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))] # 列出文件夹中所有图像文件的名称
# 创建一个3x3的单位矩阵作为膨胀操作的核
kernel = np.ones((3, 3), np.uint8)
# 遍历文件夹中的每个图像文件
for img_name in img_list:
img_path = os.path.join(orig_path, img_name) # 构建图像的完整路径
img = cv.imread(img_path) # 读取图像
if img is None: # 如果图像读取失败(例如文件不是图像或文件损坏)
print(f"Warning: Unable to read image {img_name}") # 打印警告信息
continue # 跳过当前循环迭代,继续下一个图像
img_resize = cv.resize(img, (600, 600)) # 将图像大小调整为600x600
img_gray = cv.cvtColor(img_resize, cv.COLOR_RGB2GRAY) # 将图像转换为灰度图
ret, img_bw = cv.threshold(img_gray, 200, 255, cv.THRESH_BINARY) # 使用固定阈值进行二值化处理
img_open = cv.dilate(img_bw, kernel, iterations=3) # 对二值图像进行3次膨胀操作
#cv.imshow("img_open", img_open) #图像膨胀后
# 使用连通组件分析,找出图像中的所有连通区域及其属性
num_labels, labels, stats, centroids = \
cv.connectedComponentsWithStats(img_open, connectivity=8, ltype=None)
# 遍历每个连通区域的统计信息
for i, sta in enumerate(stats):
if i == 0: # 忽略背景区域(标签为0的区域)
continue
if sta[4] < 1000: # 如果区域的面积小于1000像素
# 在原二值膨胀图像上标记该区域(用红色填充)
cv.rectangle(img_open, tuple(sta[0:2]), tuple(sta[0:2] + sta[2:4]), (0, 0, 255), thickness=-1)
# 展示图像
#cv.imshow("img_resize", img_resize)#原图
#cv.imshow("img_gray", img_gray)#灰度处理后
#cv.imshow("img_bw", img_bw) # 二值处理后
#cv.imshow("img_bw", img_bw) # 二值处理后
cv.imshow("img_open", img_open)#连通后
# 等待用户按键,如果按下'q',则退出循环
if cv.waitKey(0) & 0xFF == ord('q'):
break
#print("*" * 50) # 打印分割线
cv.destroyAllWindows() # 销毁所有OpenCV创建的窗口