Imgs,GT,Edge,Gradient_all,Gradient_Foreground

发布于:2024-06-01 ⋅ 阅读:(140) ⋅ 点赞:(0)

保存一下:
做个记录:

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()






网站公告

今日签到

点亮在社区的每一天
去签到