保存一下:
做个记录:
import cv2
import os
import numpy as np
# 对整张图片做canny检测 得到纹理图
def canny_all(input_path, output_path):
# 遍历文件夹中的所有文件
for filename in os.listdir(input_path):
# 构造完整的文件路径
image_path = os.path.join(input_path, filename)
# 确保是图片文件
if os.path.isfile(image_path) and filename.lower().endswith(('.png', '.jpg')):
# 读取图片
image = cv2.imread(image_path)
if image is None:
print(f"图片 {filename} 读取失败,请检查路径是否正确")
else:
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用Canny边缘检测
grads = cv2.Canny(gray, 100, 200) # 参数可以根据需要调整
# 构造输出文件路径
file_root, _ = os.path.splitext(filename)
save_path = os.path.join(output_path, file_root + '.png')
# 保存结果
cv2.imwrite(save_path, grads)
print(f"Canny边缘检测结果已保存到 {save_path}")
else:
print(f"跳过非图片文件 {filename}")
print("Canny_all 检测完成!")
def canny_Foreground(GT_path, Canny_all_path, output_path):
# 遍历第一个文件夹下的所有图片
for filename in os.listdir(GT_path):
# 构造两个文件夹中文件的完整路径
img_path_f1 = os.path.join(GT_path, filename)
img_path_f2 = os.path.join(Canny_all_path, filename)
# 读取图片A和B
imageA = cv2.imread(img_path_f1, cv2.IMREAD_GRAYSCALE)
imageB = cv2.imread(img_path_f2, cv2.IMREAD_GRAYSCALE)
# 检查图像B是否正确读取
if imageB is None:
print(f"在文件夹 {Canny_all_path} 中读取图片 {filename} 失败")
continue
# 检查图像A是否正确读取
if imageA is None:
print(f"在文件夹 {GT_path} 中读取图片 {filename} 失败,请检查路径是否正确")
continue
# 检查图像尺寸是否相同
if imageA.shape != imageB.shape:
print(f"图像尺寸不同,跳过文件:{filename}")
continue
# 处理图像
imageA[np.where(imageB == 0)] = 0
# 构造输出文件路径
save_path = os.path.join(output_path, filename)
# 保存处理后的图像C
cv2.imwrite(save_path, imageA)
print(f"前景纹理图已保存:{save_path}")
print("canny_Foreground 检测完成!")
def getEdge(GT_path, output_path):
# 遍历第一个文件夹下的所有图片
for filename in os.listdir(GT_path):
# 构造完整路径
GT_img = os.path.join(GT_path, filename)
# 构造输出文件路径 输出为png
file_root, _ = os.path.splitext(filename)
save_path = os.path.join(output_path, file_root + '.png')
# 读取图片
image = cv2.imread(GT_img, cv2.IMREAD_GRAYSCALE)
# 使用腐蚀操作稍微减少物体内部的白色区域,避免边界之外的误检
kernel = np.ones((3, 3), np.uint8) # 创建结构元素,这里使用3x3的矩形结构
erosion = cv2.erode(image, kernel, iterations=1)
# 使用膨胀操作突出边缘
dilation = cv2.dilate(erosion, kernel, iterations=1)
# 通过膨胀后的与膨胀前的图像做差集,得到边界
boundaries = cv2.subtract(dilation, erosion)
# 保存边界图像
cv2.imwrite(save_path, boundaries)
print(f"边界图已保存:{save_path}")
print("边界处理完毕!")
# opencv 读入图像时 img.shape代表 H W C
# GT图像需要用灰度方式读入 里面像素只有两种 0 或者 255
def main():
# 图片文件夹根路径
root_path = r'E:/project/pytorch-Project/MGNet-two-canny/TestDataset/COD10K/'
# Imgs图像路径
Imgs_path = os.path.join(root_path, 'Imgs') # 替换为你的图片文件夹路径
# GT图像路径
GT_path = os.path.join(root_path, 'GT') # 替换为你的图片文件夹路径
# 全景纹理图存储路径
Gradient_Canny_path = os.path.join(root_path, 'Gradient_Canny')
# 前景纹理图存储路径
Gradient_Foreground_path = os.path.join(root_path, 'Gradient_Foreground')
# 边界图存储路径
Edge_path = os.path.join(root_path, 'Edge')
# 确保输出文件夹存在
if not os.path.exists(Gradient_Canny_path):
os.makedirs(Gradient_Canny_path)
if not os.path.exists(Gradient_Foreground_path):
os.makedirs(Gradient_Foreground_path)
if not os.path.exists(Edge_path):
os.makedirs(Edge_path)
# 先对整张图像做canny检测
canny_all(Imgs_path, Gradient_Canny_path)
# 再生成前景纹理图
canny_Foreground(GT_path, Gradient_Canny_path, Gradient_Foreground_path)
# 生成边界图
getEdge(GT_path,Edge_path)
if __name__ == "__main__":
main()