鱼C论坛

 找回密码
 立即注册
查看: 1331|回复: 4

Pthon相对路径和绝对路径的问题

[复制链接]
发表于 2023-8-30 17:24:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位老师好,求助一个程序中相对路径和绝对路径的问题
下边程序是从网上找来的图片自动裁剪黑边的程序,勉强能看懂,原程序图片的来源和保存文件夹都是用的相对路径,运行都没有问题,我今天企图想把修改位绝对路径,折腾了一下午,毫无结果。
新手刚学了点基础课和简单的库,我能百度到的和我能想到的解决方法都尝试了,路径哪里不知道是哪里错了。
红色部分是我想改为的方式,但是不能正确的运行。
请老师指点下,谢谢。

import cv2
import os
import datetime

def change_size(read_file):
    image = cv2.imread(read_file, 1)  # 读取图片 image_name应该是变量
    img = cv2.medianBlur(image, 5)  # 中值滤波,去除黑色边际中可能含有的噪声干扰
    b = cv2.threshold(img, 15, 255, cv2.THRESH_BINARY)  # 调整裁剪效果
    binary_image = b[1]  # 二值图--具有三通道
    binary_image = cv2.cvtColor(binary_image, cv2.COLOR_BGR2GRAY)
    print(binary_image.shape)  # 改为单通道

    x = binary_image.shape[0]
    print("高度x=", x)
    y = binary_image.shape[1]
    print("宽度y=", y)
    edges_x = []
    edges_y = []
    for i in range(x):
        for j in range(y):
            if binary_image[i][j] == 255:
                edges_x.append(i)
                edges_y.append(j)

    left = min(edges_x)  # 左边界
    right = max(edges_x)  # 右边界
    width = right - left  # 宽度
    bottom = min(edges_y)  # 底部
    top = max(edges_y)  # 顶部
    height = top - bottom  # 高度

    pre1_picture = image[left:left + width, bottom:bottom + height]  # 图片截取
    return pre1_picture  # 返回图片数据



source_path = "./training_data/1/"  # 图片来源路径
save_path = "./out/"  # 图片修改后的保存路径
# source_path = r'C:\Users\mysta\Desktop\截图'  # 图片来源路径
# save_path = r'C:\Users\mysta\Desktop\IMG4PDF'  # 图片修改后的保存路径

if not os.path.exists(save_path):
    os.mkdir(save_path)
file_names = os.listdir(source_path)
starttime = datetime.datetime.now()
for i in range(len(file_names)):
    x = change_size(source_path + file_names[i])  # 得到文件名
    cv2.imwrite(save_path + file_names[i], x)
    # x = change_size(os.path.join(source_path,file_names[i]))  # 得到文件名
    # cv2.imwrite(os.path.join(save_path,file_names[i]), x)

    print("裁剪:", file_names[i])
    print("裁剪数量:", i)
    while (i == 2600):
        break
print("裁剪完毕")
endtime = datetime.datetime.now()  # 记录结束时间
endtime = (endtime - starttime).seconds
print("裁剪总用时", endtime)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-30 17:24:48 | 显示全部楼层
在这个程序中,相对路径是指相对于当前工作目录的路径,而绝对路径是指完整的文件路径。在这个问题中,您想将程序中的相对路径改为绝对路径。

要将相对路径改为绝对路径,您可以使用 os.path.abspath() 函数。该函数将相对路径转换为绝对路径。在您的代码中,您可以将 source_path 和 save_path 变量的赋值语句修改如下:
source_path = os.path.abspath("./training_data/1/")
save_path = os.path.abspath("./out/")

这样, source_path 和 save_path 变量将包含绝对路径,而不是相对路径。然后,您可以继续使用这些变量进行文件操作。

希望这可以帮助您解决问题!如果您有任何其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-30 18:18:22 | 显示全部楼层
isdkz 发表于 2023-8-30 17:24
在这个程序中,相对路径是指相对于当前工作目录的路径,而绝对路径是指完整的文件路径。在这个问题中,您想 ...

老师,抱歉可能我刚入门,还是没有看懂。
红色的赋值赋值语句是我写的,我想把两个绝对路径赋值给source_path和sace_path,然后引用change_size函数来裁剪图片,但是用绝对路径给source_path和sace_path赋值后,   
# x = change_size(os.path.join(source_path,file_names))  
# cv2.imwrite(os.path.join(save_path,file_names), x)
这两句不能正确的读取照片和保存照片。
总之就是原先程序相对路径是D:\Python\/training_data/1/,(裁剪的程序是放在D:\Python\里的)保存文件夹是D:\Python\out,
我想用桌面的 “截图”和“IMGPDF”这两个文件夹替代他,不然每次都要把照片剪切到D:\Python\/training_data/1/里边去,有点费劲。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-31 09:08:12 | 显示全部楼层
可能是路径里有中文了,我自己在调试下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-1 10:17:23 | 显示全部楼层
1.
source_path = r'C:\Users\mysta\Desktop\截图'  # 图片来源路径
save_path = r'C:\Users\mysta\Desktop\IMG4PDF'  # 图片修改后的保存路径

检查 截图 是否存在并保证它是一个文件夹

2.
for i in range(len(file_names)):
    x = change_size(source_path + file_names)  # 得到文件名
    cv2.imwrite(save_path + file_names, x)
    # x = change_size(os.path.join(source_path,file_names))  # 得到文件名
    # cv2.imwrite(os.path.join(save_path,file_names), x)
    print("裁剪:", file_names)

file_names是一个列表,不能直接与字符串相加得到文件名。
修改后的代码:
import cv2
import os
import datetime

def change_size(read_file):
    image = cv2.imread(read_file, 1)  # 读取图片 image_name应该是变量
    img = cv2.medianBlur(image, 5)  # 中值滤波,去除黑色边际中可能含有的噪声干扰
    b = cv2.threshold(img, 15, 255, cv2.THRESH_BINARY)  # 调整裁剪效果
    binary_image = b[1]  # 二值图--具有三通道
    binary_image = cv2.cvtColor(binary_image, cv2.COLOR_BGR2GRAY)
    print(binary_image.shape)  # 改为单通道

    x = binary_image.shape[0]
    print("高度x=", x)
    y = binary_image.shape[1]
    print("宽度y=", y)
    edges_x = []
    edges_y = []
    for i in range(x):
        for j in range(y):
            if binary_image[j] == 255:
                edges_x.append(i)
                edges_y.append(j)

    left = min(edges_x)  # 左边界
    right = max(edges_x)  # 右边界
    width = right - left  # 宽度
    bottom = min(edges_y)  # 底部
    top = max(edges_y)  # 顶部
    height = top - bottom  # 高度

    pre1_picture = image[left:left + width, bottom:bottom + height]  # 图片截取
    return pre1_picture  # 返回图片数据



# source_path = "./training_data/1/"  # 图片来源路径
# save_path = "./out/"  # 图片修改后的保存路径
source_path = r'C:\Users\mysta\Desktop\截图'  # 图片来源路径
save_path = r'C:\Users\mysta\Desktop\IMG4PDF'  # 图片修改后的保存路径
if not os.path.exists(save_path):
    os.mkdir(save_path)
file_names = os.listdir(source_path)
starttime = datetime.datetime.now()
for name in file_names:
    # x = change_size(source_path + name)  # 得到文件名
    # cv2.imwrite(save_path + name, x)
    x = change_size(os.path.join(source_path,name))  # 得到文件名
    cv2.imwrite(os.path.join(save_path,name), x)
    print("裁剪:", name)
    print("裁剪数量:", len(file_names))
print("裁剪完毕")
endtime = datetime.datetime.now()  # 记录结束时间
endtime = (endtime - starttime).seconds
print("裁剪总用时", endtime)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 15:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表