由.DS_store文件导致cv2.imread()函数报错的解决办法

问题背景:

运行图片灰度增强代码时报错,先后检查了图片的路径、cv2.imread() 函数的格式以及代码逻辑,确认均无误后报错依然无法消失。

代码:

# coding:utf-8
# 图片灰度增强

import math
import cv2 as cv
import numpy as np
import os

# 统计灰度分布
def calc_hist(img):
    rows, cols = img.shape[:2]
    hist = np.zeros(256, np.uint64)
    for r in range(rows):
        for c in range(cols):
            hist[img[r, c]] += 1

    return hist

def equalize_hist(img):
    rows, cols = img.shape[:2]
    hist = calc_hist(img)

    # 计算灰度累积分布
    # 注意数据类型为np.uint32,防止溢出
    hist_sum = np.zeros([256], np.uint32)
    for i in range(256):
        if i == 0:
            hist_sum[i] = hist[i]
        else:
            hist_sum[i] = hist[i] + hist_sum[i - 1]

    # 输出图像的灰度分布
    output_hist = np.zeros(256, np.uint8)
    cofficient = 256.0 / (rows * cols)
    for i in range(256):
        q = cofficient * float(hist_sum[i]) - 1
        if q >= 0:
            output_hist[i] = math.floor(q)
        else:
            output_hist[i] = 0

    # 输出图像的像素值
    output_img = np.zeros([rows, cols], np.uint8)
    for r in range(rows):
        for c in range(cols):
            output_img[r, c] = output_hist[img[r, c]]

    return output_img


if __name__ == "__main__":
    print('start')
    write_dir = '/Users/***/Desktop/距离酒依赖/Gray_train/'
    file_list = os.listdir('/Users/***/Desktop/距离酒依赖/train')
    len = len(file_list)
    for i in range(len):
        path = '/Users/***/Desktop/距离酒依赖/train/' + file_list[i]
        img = cv.imread(path, 0)
        img_equalized = equalize_hist(img)
        path_write = write_dir + file_list[i]
        cv.imwrite(path_write, np.array(img_equalized))
    print('end')

报错信息:

Traceback (most recent call last):
  File "/Users/***/Desktop/***.py", line 59, in <module>
    img_equalized = equalize_hist(img)
  File "/Users/***/Desktop/***.py", line 19, in equalize_hist
    rows, cols = img.shape[:2]
AttributeError: 'NoneType' object has no attribute 'shape'

 报错的含义是无法得到 img 的长、宽值。实际上,这是由于没有 img 传入equalize_hist (img) 导致的。

但是,经过我查看增强后图片所在的文件夹发现已经生成了部分图片。

 因此,我判断这个报错必然是由于某一个图片文件引起的。

于是,我通过在 cv2.imread () 前将图片的路径打印出来以确定到底是哪个文件出现了问题。

if __name__ == "__main__":
    print('start')
    write_dir = '/Users/fengyifan/Desktop/距离酒依赖/Gray_train/'
    file_list = os.listdir('/Users/fengyifan/Desktop/距离酒依赖/train')
    len = len(file_list)
    for i in range(len):
        path = '/Users/fengyifan/Desktop/距离酒依赖/train/' + file_list[i]
        print(path)
        img = cv.imread(path, 0)
        img_equalized = equalize_hist(img)
        path_write = write_dir + file_list[i]
        cv.imwrite(path_write, np.array(img_equalized))
    print('end')

运行结果显示,使程序报错的文件为格式是.DS_store 的一个文件,cv2.imread () 函数无法读取这种格式的文件的,因此程序报错。

 据此,我判断只要避开这个文件便可。所以,只需一个 if 判断就解决了程序报错的问题。

if __name__ == "__main__":
    print('start')
    write_dir = '/Users/***/Desktop/距离酒依赖/Gray_train/'
    file_list = os.listdir('/Users/***/Desktop/距离酒依赖/train')
    len = len(file_list)
    for i in range(len):
        path = '/Users/***/Desktop/距离酒依赖/train/' + file_list[i]
        if path != '/Users/***/Desktop/距离酒依赖/train/.DS_Store':
            img = cv.imread(path, 0)
            img_equalized = equalize_hist(img)
            path_write = write_dir + file_list[i]
            cv.imwrite(path_write, np.array(img_equalized))
    print('end')

结果: 

成功解决!


知识扩展:

.DS_store 文件: 该文件是 Mac OS 保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于 Windows 的 desktop.ini

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值