from pymysql import connect, cursors import os import requests import json from PIL import Image import cv2 import numpy as np import xlwt dbconn = connect( host='rm-2zepcf8kag0aol0q48o.mysql.rds.aliyuncs.com', port=3306, user='ai_root', password='ai_root888', db='medical_platform', charset='utf8', cursorclass=cursors.DictCursor) # dbconn = connect( # host=dbhost, # port=dbport, # user=dbuser, # password=dbpwd, # db=dbname, # charset=dbcharset, # cursorclass=cursors.DictCursor) def query(sql): with dbconn.cursor() as cursor: cursor.execute(sql) dbconn.commit() return cursor.fetchall() def get_files_in_directory(directory): file_paths = [] for root, dirs, files in os.walk(directory): for file in files: file_paths.append(os.path.join(root, file)) return file_paths def copy_and_save_image(input_image_path, output_image_path, filename): try: os.makedirs(output_image_path, exist_ok=True) img = Image.open(input_image_path) img.copy().save(output_image_path+filename) except Exception as e: # 异常处理代码 print(e) def cp_img(name): i = 0 size = 100 while i <= 100: page = i * size i += 1 sql_str = 'select m.de_instances_id, s.de_kind_id, m.de_position_name, m.de_system_name, m.de_organ_name, m.de_disease_name, m.de_symptom_name, i.png, i.is_boost, i.boost_png' \ ' from hos_database.de_instance_new_mark as m' \ ' left join hos_database.de_instances as i on m.de_instances_id = i.id ' \ ' left join hos_database.de_system as s on m.de_system_id = s.id ' \ ' where m.de_organ_name = "'+name+'"' \ ' limit ' + str(page) + ', ' + str(size) rows = query(sql_str) if len(rows) == 0 : break print(i) de_instance_id = '' for v3 in rows: de_instance_id += str(v3['de_instances_id'])+',' de_instance_id = de_instance_id.strip(',') # examine_pass_status 审核状态 1 未完成 2 未通过 3 通过 4 待审核 # instance_type 基础模块 1图像质量2 摆位 3 区域/器官 4 病症 # valid_status 病症状态 1有病症 2 无病症 3 无效 4 未标记 5 不确定 sql_str2 = 'select de_instance_id from medical_platform.dcm_image_list_instance' \ ' where de_instance_id in ('+de_instance_id+')' \ ' and instance_type = 4 ' rows2 = query(sql_str2) for v2 in rows2: for v in rows: if v2['de_instance_id'] == v['de_instances_id']: png = '' if v['is_boost'] == 1: png = v['boost_png'] else: png = v['png'] species = '' if v['de_kind_id'] == 1: species = 'cat' else: species = 'dog' # print(v['de_instances_id'], v['de_organ_name'], v['de_disease_name'], v['de_symptom_name'], jpeg, png, v['_value']) filename = png.split("/")[-1] # download_image(png, "/disk0/data/images/disease/"+name+"/",filename) input_path = "/disk0/data/images/positive/"+name+"/"+filename # 输入图片文件路径 output_path = "/disk0/data/organ/"+species+"/"+v['de_position_name']+"/"+v['de_system_name']+"/"+v['de_organ_name']+"/" # 输出图片文件路径 copy_and_save_image(input_path, output_path,filename) output_path2 = "/disk0/data/symptom/"+species+"/"+v['de_position_name']+"/"+v['de_system_name']+"/"+v['de_symptom_name']+"/" # 输出图片文件路径 copy_and_save_image(input_path, output_path2,filename) # 阳性 def img1(name): i = 0 size = 100 while i <= 100: page = i * size i += 1 sql_str = 'select m.de_instances_id, m._value, m.de_organ_name, m.de_disease_name, m.de_symptom_name, i.jpeg, i.png, i.is_boost, i.boost_jpeg, i.boost_png' \ ' from hos_database.de_instance_new_mark as m' \ ' left join hos_database.de_instances as i on m.de_instances_id = i.id ' \ ' where m.de_disease_name = "'+name+'"' \ ' limit ' + str(page) + ', ' + str(size) rows = query(sql_str) if len(rows) == 0 : break print(i) de_instance_id = '' for v3 in rows: de_instance_id += str(v3['de_instances_id'])+',' de_instance_id = de_instance_id.strip(',') # examine_pass_status 审核状态 1 未完成 2 未通过 3 通过 4 待审核 # instance_type 基础模块 1图像质量2 摆位 3 区域/器官 4 病症 # valid_status 病症状态 1有病症 2 无病症 3 无效 4 未标记 5 不确定 sql_str2 = 'select de_instance_id from medical_platform.dcm_image_list_instance' \ ' where de_instance_id in ('+de_instance_id+')' \ ' and instance_type = 4 ' rows2 = query(sql_str2) for v2 in rows2: for v in rows: if v2['de_instance_id'] == v['de_instances_id']: jpeg = '' png = '' if v['is_boost'] == 1: jpeg = v['boost_jpeg'] png = v['boost_png'] else: jpeg = v['jpeg'] png = v['png'] # print(v['de_instances_id'], v['de_organ_name'], v['de_disease_name'], v['de_symptom_name'], jpeg, png, v['_value']) filename = png.split("/")[-1] download_image(png, "/disk0/data/images/disease/"+name+"/",filename) # 阴性 def img2(): i = 0 size = 100 while i <= 100: page = i * size i += 1 # examine_pass_status 审核状态 1 未完成 2 未通过 3 通过 4 待审核 # instance_type 基础模块 1图像质量2 摆位 3 区域/器官 4 病症 # valid_status 病症状态 1有病症 2 无病症 3 无效 4 未标记 5 不确定 sql_str = 'select de_instance_id from medical_platform.dcm_image_list_instance' \ ' where instance_type = 4 and examine_pass_status = 3 and valid_status = 2' \ ' order by id desc limit ' + str(page) + ', ' + str(size) rows = query(sql_str) if len(rows) == 0: break de_instance_id = '' for v2 in rows: de_instance_id += str(v2['de_instance_id'])+',' de_instance_id = de_instance_id.strip(',') sql_str3 = 'select m.de_instances_id, m._value, m.de_organ_name, m.de_disease_name, m.de_symptom_name, i.ethnic_group, i.jpeg, i.png, i.is_boost, i.boost_jpeg, i.boost_png' \ ' from hos_database.de_instances as i' \ ' left join hos_database.de_instance_new_mark as m on m.de_instances_id = i.id ' \ ' where i.id in ('+de_instance_id+')' rows3 = query(sql_str3) print(i) if len(rows3) == 0: continue for v3 in rows3: if v3['de_instances_id'] is None: png = '' if v3['is_boost'] == 1: png = v3['boost_png'] else: png = v3['png'] # species = '' # if v3['ethnic_group'] == '猫': # species = 'cat' # else: # species = 'dog' # print(v['de_instances_id'], v['de_organ_name'], v['de_disease_name'], v['de_symptom_name'], jpeg, png, v['_value']) filename = png.split("/")[-1] output_path = "/disk0/data/negative02/" # 输出图片文件路径 download_image(png, output_path, filename) def download_image(url, save_path, filename): try: # 发送HTTP GET请求 response = requests.get(url) # 检查请求是否成功 if response.status_code == 200: os.makedirs(save_path, exist_ok=True) # 以二进制写入文件 with open(save_path+filename, 'wb') as file: file.write(response.content) print(f"Image successfully downloaded: {save_path}") else: print(f"Failed to retrieve image. Status code: {response.status_code}") except Exception as e: print(f"An error occurred: {e}") # 单 def froi_img(image_path, output_path, filename, data): try: img = cv2.imread(image_path) height, width = img.shape[:2] image = np.zeros((height, width, 3), np.uint8) points = data['handles']['points'] i = 0 c = len(points) area = [] while i < c: area.append([int(points[i]['x']),int(points[i]['y'])]) i+=1 if i == c: area.append([int(points[0]['x']),int(points[0]['y'])]) cv2.fillPoly(image,np.array([area]), color=(255, 255, 255)) cv2.imwrite(output_path+filename, image) except Exception as e: # 异常处理代码 print(e) def froi(de_position_name, de_disease_name): i = 17 size = 200 while i <= 36: page = i * size i += 1 sql_str3 = 'select m.de_instances_id, m._value, m.de_organ_id, m.de_organ_name, m.de_disease_id, m.de_disease_name, m.de_symptom_id, m.de_symptom_name, i.ethnic_group, i.jpeg, i.png, i.is_boost, i.boost_jpeg, i.boost_png' \ ' from hos_database.de_instances as i' \ ' left join hos_database.de_instance_new_mark as m on m.de_instances_id = i.id ' \ ' where m.de_position_name="'+de_position_name + '" and m.de_disease_name = "'+de_disease_name + '" and mark_type = "FreehandRoi"' \ ' limit ' + str(page) + ', ' + str(size) rows3 = query(sql_str3) print(i) if len(rows3) == 0: continue for v3 in rows3: png = '' if v3['is_boost'] == 1: png = v3['boost_png'] else: png = v3['png'] filename = png.split("/")[-1] input_path = "/disk0/data/images/disease/"+de_disease_name+"/"+filename # 输入图片文件路径 output_path = "/disk0/data/disease_symptom/"+de_disease_name+"/" # 输入图片文件路径 output_path_ori = "/disk0/data/disease_symptom/"+de_disease_name+"_ori/" # 输入图片文件路径 data_froi = json.loads(v3['_value']) save_filename = str(v3['de_symptom_id'])+"_"+filename copy_and_save_image(input_path, output_path_ori, save_filename) froi_img(input_path, output_path, save_filename, data_froi) # 多 def froi_img2(image_path, output_path, filename, data): try: img = cv2.imread(image_path) height, width = img.shape[:2] image = np.zeros((height, width, 3), np.uint8) for v in data: points = v['handles']['points'] i = 0 c = len(points) area = [] while i < c: area.append([int(points[i]['x']),int(points[i]['y'])]) i+=1 if i == c: area.append([int(points[0]['x']),int(points[0]['y'])]) cv2.fillPoly(image,np.array([area]), color=(255, 255, 255)) cv2.imwrite(output_path+filename, image) except Exception as e: # 异常处理代码 print(e) def froi2(): i = 44 size = 100 while i <= 100: page = i * size i += 1 sql_str2 = "select de_instances_id from hos_database.de_instance_new_mark as m " \ " where m.de_organ_name in ('全肺','右肺','右肺中叶','右肺前叶','右肺后叶','左肺','左肺前叶前部','左肺前叶后部','左肺后叶') and mark_type = 'FreehandRoi'" \ " limit " + str(page) + ", " + str(size) rows2 = query(sql_str2) de_instance_id = '' for v2 in rows2: de_instance_id += str(v2['de_instances_id'])+',' de_instance_id = de_instance_id.strip(',') sql_str3 = 'select m.de_instances_id, m._value, m.de_organ_id, m.de_organ_name, m.de_disease_id, m.de_disease_name, m.de_symptom_id, m.de_symptom_name, i.ethnic_group, i.jpeg, i.png, i.is_boost, i.boost_jpeg, i.boost_png' \ ' from hos_database.de_instances as i' \ ' left join hos_database.de_instance_new_mark as m on m.de_instances_id = i.id ' \ ' where m.de_instances_id in (' + de_instance_id + ') and mark_type = "FreehandRoi"' rows3 = query(sql_str3) print(i) if len(rows3) == 0: continue frois = [] data_frois = {} for vv in rows3: if data_frois.get(vv['de_instances_id']) is None : frois.append(vv) data_frois[vv['de_instances_id']] = [] data_frois[vv['de_instances_id']].append(json.loads(vv['_value'])) for v3 in frois: png = '' if v3['is_boost'] == 1: png = v3['boost_png'] else: png = v3['png'] filename = png.split("/")[-1] # input_path = "/disk0/data/images/disease/"+v3['de_disease_name']+"/"+filename # 输入图片文件路径 output_path = "/disk0/data/organ02/lungs/" # 输入图片文件路径 output_path_ori = "/disk0/data/organ02/lungs_ori/" # 输入图片文件路径 save_filename = str(v3['de_organ_id'])+"_"+filename download_image(png, output_path_ori, save_filename) froi_img2(output_path_ori+save_filename, output_path, save_filename, data_frois[v3['de_instances_id']]) def froi22(name): sql_str = "select study_instance_uid, manufacturers_model_name from hos_database.dcm_list as d " \ " where manufacturers_model_name ='"+name+"'" \ " order by id desc limit 20 " rows = query(sql_str) u1 = r'https://viewer.ai-vpet.cn/viewer/' # u2 = r'?token=bXOBCY7M49NpTTGPHApDATRu%2FgY0PRp6ofB30I%2BfH3Zp%2BAZz4hoceaj9FDqy%2FGEA%2BTQvLmBGmMn0y0DPA67pVf6JfQR0LQm0qrBtuCPHHG%2F8x8di3C9Fu2sCwRXbyh93ftjY7%2Bi%2FDOQ6Ib4y1EHafg%3D%3D' u2 = r'?token=L4CCTl5V4p%2FoFxXzhkoI%2BYj8LOS3oyRLXVX3KSCE1vZM7RpBTQsmNVUBKKmAzHorWTmBoAN2z7wRnoczmB6HytITFLtw9FCFTmIkIBrpyJaI1QZS3uc6peZTEpmcyBhICCZ%2B5F0tZOhe78Be5DoYEw%3D%3D' print(name) print('\n') for v in rows: print(u1+v['study_instance_uid']+u2) print('\n') def froi24(): names2 = [ '1.2.410.200067.100.1.202306132151100227.16179', '1.2.410.200067.100.1.202306111919530050.13775', '1.2.410.200067.100.1.202306101808590285.1618', '1.2.410.200067.100.1.202306221642290522.30621', '1.2.410.200067.100.1.202406211032310879.15457', '1.2.410.200067.100.1.202408021330260999.3052', '1.2.276.0.7230010.3.3.1.20240828000000000.859487075', '1.2.840.197608.1.15212033170821.1788', '1.2.840.197608.1.15212033170821.16', '172.115.1207.167.1218.1219.20240827204621.114', '1228.184.1232.1223.158.197.20240828173020.1', '1.2.156.112677.1000.101.20240830182741.1', '1.2.156.112677.1000.101.20240830180240.31' ] # encoding:设置编码,默认是ascii,一般设置为utf-8,可支持中文; #style_compression保持默认即可 work_book = xlwt.Workbook(encoding='utf-8') # 创建一个sheet对象,相当于创建一个sheet页,填入sheet页的名称 sheet_data = work_book.add_sheet('sheet1') # 向sheet页中添加数据:函数write,参数分别带入(行号,列号,填入的值),行和列从0开始。 #其中还有一个参数style=Style.default_style,用于设置字体/单元格格式/对齐方式等,不设置会使用默认值。 sheet_data.write(0,0,'医院名称') # 第1行第1列写入数据 此处先不用样式,后面介绍 sheet_data.write(0,1,'联系电话') sheet_data.write(0,2,'医院码') sheet_data.write(0,3,'来源') sheet_data.write(0,4,'uid') sheet_data.write(0,5,'厂家') sheet_data.write(0,6,'url') for k,v in enumerate(names2): sql_str = "select it.id, study_instance_uid, manufacturers_model_name, it._value "\ " from hos_database.de_instance_tag as it " \ " left join hos_database.de_instances as i on it.de_instances_id = i.id " \ " left join hos_database.de_series as s on i.de_series_id = s.id " \ " left join hos_database.de_study as t on s.de_study_id = t.id " \ " where study_instance_uid ='"+v+"'" rows = query(sql_str) sql_str2 = "select h._name, h.hospital_code, h.create_phone, h.is_bk "\ " from hos_database.dcm_list as l " \ " left join hos_database.hospital_main as h on l.hospital_code = h.hospital_code " \ " where study_instance_uid ='"+v+"'" rows2 = query(sql_str2) u1 = r'https://viewer.ai-vpet.cn/viewer/' # u2 = r'?token=bXOBCY7M49NpTTGPHApDATRu%2FgY0PRp6ofB30I%2BfH3Zp%2BAZz4hoceaj9FDqy%2FGEA%2BTQvLmBGmMn0y0DPA67pVf6JfQR0LQm0qrBtuCPHHG%2F8x8di3C9Fu2sCwRXbyh93ftjY7%2Bi%2FDOQ6Ib4y1EHafg%3D%3D' u2 = r'?token=g4BFXADwt8fWcqVddlQSo4iqx8O%2BWBJwtrg11nXHj3z0tsQX0ZaGNivn5jYHoMEZN4jltj5ZU%2BbP4ztqNbwYEZhTXOf0J0szHsf7a19lWJPIutkw4I3Gg%2B474FhY73CqQn0lv%2FmcJK9v37hyf24Z6g%3D%3D' data = json.loads(rows[0]['_value']) url = u1+rows[0]['study_instance_uid']+u2 # 0 vpet 1 谛宝医生 2 必康 is_bk = '' if rows2[0]['is_bk'] == 0 : is_bk = 'vpet' elif rows2[0]['is_bk'] == 1 : is_bk = '谛宝医生' elif rows2[0]['is_bk'] == 2 : is_bk = '必康' l = k+1 sheet_data.write(l,0,rows2[0]['_name']) sheet_data.write(l,1,rows2[0]['create_phone']) sheet_data.write(l,2,rows2[0]['hospital_code']) sheet_data.write(l,3,is_bk) sheet_data.write(l,4,v) sheet_data.write(l,5,data['0008,0070']['Value']) sheet_data.write(l,6,url) #保存为后缀为xls或者xlsx的excel表 #保存为xlsx时,后续的设置样式不会生效 所以我们保存为xls后缀文件 work_book.save('1.xls') def froi31(image_path): try: img = cv2.imread(image_path) a = np.mean(img) print(a) except Exception as e: # 异常处理代码 print(e) if __name__ == '__main__': de_disease_names = [ "乳腺肿瘤", "会阴疝", "体表肿物", "便秘", "关节炎", "关节脱位", "其他", "前列腺结石", "前列腺肿大", "占位性病变", "右心房增大", "后腔静脉裂孔疝", "哮喘", "子宫蓄脓", "小肝征", "尿道结石", "尿闭", "巨大团块", "巨结肠", "幼龄动物", "幽门梗阻", "心源性肺水肿", "心脏增大", "支气管炎", "椎体脱位", "椎体错位", "横膈疝", "气管塌陷", "气胸", "犬未到达T12后缘", "猫未到达T13后缘", "皮下气肿", "皮下积气", "肋骨肋软骨矿化", "肝区占位性病变", "肝脏增大", "肝脏缩小", "肝脏肿大", "肠梗阻", "肠道异物", "肺不张", "肺大疱", "肺气肿", "肺水肿", "肺炎", "肾结石", "肾肿大", "肾萎缩", "肿瘤", "肿瘤转移性改变", "胃体积增大", "胃内异物", "胃后区体积增大", "胃扩张扭转", "胃扩张积气", "胃肠道穿孔", "胆囊壁矿化", "胆囊结石", "胸腔积液", "脾脏肿大", "腹壁疝", "腹股沟疝", "腹腔积气", "腹腔积液", "腹膜心包疝", "膀胱破裂", "膀胱结石", "输尿管结石", "锥体脱位", "食道异物", "食道积气", "食道积液", "食道积食", "食道裂孔疝", "骨折", "骨折后愈合", "骨质增生", "骨质疏松", "髋关节发育不良" ] de_organ_names = [ "中腹区", "主动脉(弓)", "体表", "全心", "全肺", "前列腺区", "前腹区", "双侧皮下", "右侧皮下", "右心室", "右心房", "右肺", "右肺中叶", "右肺前叶", "右肺后叶", "后腔静脉", "后腹区", "子宫及其附件区", "子宫及附件区", "小肠", "尺骨", "尾椎", "尿道", "左侧皮下", "左心室", "左心房", "左心脏", "左肺", "左肺前叶前部", "左肺前叶后部", "左肺后叶", "左腿", "心前三角区", "心包", "心区", "心胸三角区", "掌骨", "桡骨", "椎隔三角区", "皮下", "结肠", "肋软骨", "肋骨", "肝脏", "股骨", "肱骨", "肺", "肾", "胃", "胆囊", "背侧皮下", "背部皮下", "胫骨", "胸椎", "胸骨", "脾脏", "腓骨", "腰椎", "腹侧皮下", "腹膜腔", "腹部皮下", "膀胱", "膝关节", "花瓣", "荐椎", "趾骨", "输尿管", "近贲门处", "骨盆区", "髋关节" ] # for v in de_organ_names: # print(v) # cp_img(v) # img2() # froi('胸部','肺炎') # froi2() names = [ # 'Copyright(C) SUZHOUHEYI MEDICAL', # 'Copyright(C)E-COM', # 'CT Q560a', # 'DBC DR', # 'E-COM DR-2000 VET Digital Radiography Operating Console Software', # 'E-COM DR-2000 VET Digital Radiography Operating Console Software v6.0', # 'E-COM DR-2000 VET Êý×ÖXÉäÏßÊÞÓÃϵͳ¿ØÖÆÈí¼þ v6.0', # 'E-COM DR-2000 VET 数字X射线兽用系统控制软件 v6.0', # 'ELITE 2000', # 'Monet64', # 'Quantum CT Q560a', # 'Quantum CT T752', 'RayNova DR', 'Supernova C5', 'Superpet', 'VanGogh P8', 'VanGogh SC8', 'Xmaru Series' ] # for v in names2: # froi24() # image_path = '/Users/haoyanbin/Downloads/28bdb020-05eb73c5-df89b21c-df391c83-5022fd3d.png' # image_path2 = '/Users/haoyanbin/Desktop/db0d2877-16a5787c-4c8d67c4-071097fc-deee3b7e.png' # froi31(image_path) # froi31(image_path2)