Eric12219180 2023-03-23 16:48 采纳率: 62.2%
浏览 82
已结题

kaggle CBIS-DDSM 依照breast density分类图片

kaggle上的CBIS-DDSM下面又有两个文件夹[csv, jpeg]。 csv文件夹中有六个文件分别为:[calc_case_description_test_set.csv calc_case_description_train_set.csv dicom_info.csv mass_case_description_test_set.csv mass_case_description_train_ set.csv meta.csv]。 另外, jpeg 文件夹中分别有好几个名子类似为“1.3.6.1.4.1.9590.100.1.2.100018879311824535125115145152454291132”的文件夹里面有“cropped images”,“full mammogram images”,“ROI mask images”。 请帮我依据“breast density”的等级分成四个文件夹1 2 3 4。 并且1 2 3 4文件夹中又个别有子文件夹“cropped images”,“full mammogram images”,“ROI mask images”。
声明: 请勿用chatGPT, 因为他给的答案是错的

  • 写回答

4条回答 默认 最新

  • cjh4312 2023-03-25 08:49
    关注
    
    import os
    import shutil
    import pandas as pd
    import re
    import cv2
    
    #区分roi和cropped图片
    def classify_img(filename):
        img=cv2.imread(filename)
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        r, c = gray_img.shape[:2]
        piexs_sum = r * c
    
        dark_points = (gray_img < 20)
        target_array = gray_img[dark_points]
        dark_sum = target_array.size
        dark_prop = dark_sum / (piexs_sum)
        if dark_prop >= 0.85:
            return True
        else:
            return False
        
    #复制文件函数
    def copy_files(dd):
        global num
        for n in range(len(dd)):
            #取出full images的路径
            d=re.findall(r'/(.*)/', dd.loc[n,'image file path'])[0]
            a=re.findall(r'/(.*)', d)[0]
            old_path=f"D:/workstation/CBIS_DDSM/jpeg/{a}"
            patient_id=dd.loc[n,'patient_id']
            abnormality_id=dd.loc[n,'abnormality id']
            left_or_right=dd.loc[n,'left or right breast']
            pathology=dd.loc[n,'pathology']
            _class={'BENIGN_WITHOUT_CALLBACK':0,'BENIGN':1,'MALIGNANT':2}
            view=dd.loc[n,'image view']
            density=dd.iat[n,1]
            if os.path.exists(old_path):
                full_filenames=os.listdir(old_path)
                #完整图片只有一个
                for i in full_filenames:
                    shutil.copy(f"{old_path}/{i}", f'd:/workstation/images/{density}/full/{patient_id}_{left_or_right}_{view}_{abnormality_id}_{_class[pathology]}_{density}.jpg')
                    num+=1
            #取出cropped 和roi image的路径,同一个路径下        
            d=re.findall(r'/(.*)/', dd.loc[n,'cropped image file path'])[0]
            a=re.findall(r'/(.*)', d)[0]
            old_path=f"D:/workstation/CBIS_DDSM/jpeg/{a}"
            #裁剪图片和标注图片各一个,同一个文件夹下,使用图像识别
            if os.path.exists(old_path):
                cropped_filenames=os.listdir(old_path)
                for i in cropped_filenames:
                    if classify_img(f"{old_path}/{i}"):
                        shutil.copy(f"{old_path}/{i}", f'd:/workstation/images/{density}/roi/{patient_id}_{left_or_right}_{view}_{abnormality_id}_{_class[pathology]}_{density}.jpg')
                        num+=1
                    else:
                        shutil.copy(f"{old_path}/{i}", f'd:/workstation/images/{density}/cropped/{patient_id}_{left_or_right}_{view}_{abnormality_id}_{_class[pathology]}_{density}.jpg')
                        num+=1
                        
    name_list={'calc_test':'calc_case_description_test_set','calc_train':'calc_case_description_train_set',\
               'mass_test':'mass_case_description_test_set','mass_train':'mass_case_description_train_set'}
    #创建4个文件夹及其子文件夹
    for i in range(5):
        os.makedirs(f"d:/workstation/images/{i}/full",exist_ok=True)
        os.makedirs(f"d:/workstation/images/{i}/cropped",exist_ok=True)
        os.makedirs(f"d:/workstation/images/{i}/roi",exist_ok=True)
    num=0#记录复制文件数
    #每个csv的结构是一样的,所以调用同一个函数
    for i in name_list.keys():
        dd=pd.read_csv(f'D:/workstation/CBIS_DDSM/csv/{name_list[i]}.csv')
        copy_files(dd)
        print(f'复制了{num}个文件')
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 已采纳回答 3月25日
  • 赞助了问题酬金20元 3月24日
  • 赞助了问题酬金20元 3月23日
  • 展开全部

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵