import cv2
import multiprocessing
import os
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def get_img(input_dir):
img_paths = []
for (path,dirname,filenames) in os.walk(input_dir):
for filename in filenames:
img_paths.append(path+'/'+filename)
print("img_paths:",img_paths)
return img_paths
def tran(img_paths,output_dir):
imread_failed = []
try:
#img = cv2.imread(img_paths)
img = Image.open(img_paths)
pic = img.convert('RGBA') # 转为RGBA模式
#print("哈哈哈哈哈哈")
width,height = pic.size
#print("哈哈哈哈哈哈")
array = pic.load() # 获取图片像素操作入口
for i in range(width):
for j in range(height):
pos = array[i,j] # 获得某个像素点,格式为(R,G,B,A)元组
# 如果R G B三者都大于240(很接近白色了,数值可调整)
isEdit = (sum([1 for x in pos[0:3] if x <= 0]) == 3)
if isEdit:
# 更改为透明
array[i,j] = (255,255,255,0)
#cv2.imwrite(output_dir + '/' + img_paths.split('/')[-1], pic)
plt.imshow(pic, cmap=plt.cm.gray)
# plt.axis('off')
plt.savefig(output_dir + '/' + img_paths.split('/')[-1] + ".tiff")
# pic.save("output_dir + '/' + img_paths.split('/')[-1].tiff")
# cv2.waitKey(0)
# cv2.destroyAllWindows()
except:
imread_failed.append(img_paths)
return imread_failed
def main(input_dir,output_dir):
img_paths = get_img(input_dir)
scale = len(img_paths)
results = []
pool = multiprocessing.Pool(processes = 4)
for i,img_path in enumerate(img_paths):
a = "#"* int(i/10)
b = "."*(int(scale/10)-int(i/10))
c = (i/scale)*100
results.append(pool.apply_async(tran, (img_path,output_dir )))
print('{:^3.3f}%[{}>>{}]'.format(c, a, b)) # 进度条(可用tqdm)
pool.close() # 调用join之前,先调用close函数,否则会出错。
pool.join() # join函数等待所有子进程结束
for result in results:
print('image read failed!:', result.get())
print ("All done.")
if name == "main":
input_dir = "G:/aml/new/finalfile/train/LYA/" # 读取图片目录表
output_dir = "G:/aml/new/tran_bg/train/LYA/" # 保存图像目录
main(input_dir, output_dir)
我想要的是一张图片只有一个细胞,但生成了n个细胞一张图,不知道是代码哪里出问题了哎