Python+Glob批量处理图片仅单张生效问题求助
问题分析与修复方案
错误原因
- 核心处理逻辑未循环执行:边缘检测、霍夫变换、画线这些关键代码写在了遍历文件的循环外面,仅会处理最后一张读入的图片,其余图片完全没经过处理流程。
- 处理结果未存入列表:
image_list里存的是原始读入的图片,处理后的图片没有更新到列表中,最后保存的自然是未修改的原图。 - 保存路径无效:用带通配符的
path拼接文件名,会生成类似opencv/imgs/*.*1.jpg的错误路径,系统无法识别。
修正后的代码
import numpy as np import cv2 import os import glob from skimage import img_as_ubyte image_list = [] # 先获取图片目录,避免用带通配符的路径 img_dir = "opencv/imgs" path = os.path.join(img_dir, "*.*") for file in glob.glob(path): print(file) # 读入图片 img = cv2.imread(file) # 复制一份用于处理,避免修改原始引用(更安全) processed_img = img.copy() # --- 核心处理逻辑移到循环内,每张图都执行 --- gray = cv2.cvtColor(processed_img, cv2.COLOR_BGR2GRAY) img_blur = cv2.GaussianBlur(gray, (3,5), 2) edges = cv2.Canny(image=img_blur, threshold1=25, threshold2=50) # Canny Edge Detection # Apply HoughLinesP method lines_list = [] lines = cv2.HoughLinesP( edges, 1, np.pi/2, threshold=225, minLineLength=60, maxLineGap=400) # 处理霍夫变换结果,判断lines是否为空(避免无直线时报错) if lines is not None: for points in lines: x1,y1,x2,y2 = points[0] # 修正原代码中重复赋值x0的错误 cv2.line(processed_img, (x1,y1), (x2,y2), (0,255,0), 4) lines_list.append([(x1,y1),(x2,y2)]) # --- 将处理后的图片存入列表 --- image_list.append(processed_img) # 保存处理后的图片 img_number = 1 for processed_img in image_list: # 生成正确的保存路径,避免覆盖原图片 save_path = os.path.join(img_dir, f"processed_{img_number}.jpg") lines_image = img_as_ubyte(processed_img) cv2.imwrite(save_path, lines_image) img_number +=1
额外说明
- 修正了霍夫变换中提取坐标的错误:原代码
x0,y1,x0,y2=points[0]是重复赋值x0,会导致只画垂直线,改为x1,y1,x2,y2才能正确识别所有直线。 - 增加
lines is not None判断,避免图片中无检测直线时触发报错。 - 用
os.path.join生成路径,适配不同系统的路径分隔符。 - 保存时给处理后的图片加
processed_前缀,防止覆盖原图片。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

