一、需求
1、截取出图像中的框选区域(病变区域),归为一类
2、截取出背景作为一类
二、实验
1、数据:灰度图上有矩形框标注
- hemo为红框、NP为绿框、此外还需从中截取出部分背景
2、 截取框中的区域
import cv2 as cv
import numpy as np
import os
import shutil
import skimage
from skimage.measure import regionprops,label
from skimage import data,util
def get_files(path):
files=os.listdir(path)
return files
def cv_imread(file):
img = cv.imdecode(np.fromfile(file, dtype=np.uint8), -1)
return img
def cv_imwrite(filename, src):
cv.imencode(".jpg", src)[1].tofile(filename)
path_1='F:/data/data3/label/hemo/'
path_2='F:/data/data3/raw/'
path_3='F:/data/data3/depart/hemo/'
files=os.listdir(path_1)
for file in files:
img=cv_imread(path_1+file)
#转换成HSV方便提取边框
hsv=cv.cvtColor(img,cv.COLOR_BGR2HSV)
lower_hsv=np.array([0,43,46])
high_hsv=np.array([10,255,255])
mask=cv.inRange(hsv,lowerb=lower_hsv,upperb=high_hsv)
mask2=mask/255
label_img=label(mask2,connectivity=mask.ndim)
props = regionprops(label_img)
raw=path_2+file#读取原始数据
img_raw=cv_imread(raw)
new_file,_=file.split('.')#去掉后缀名
for i in range(len(props)):
y1,x1,y2,x2=props[i].bbox
area=abs((y1-y2)*(x1-x2))
if area>50:#筛除过小的区域
img_save=img_raw[y1:y2,x1:x2]
cv_imwrite(path_3+new_file+'_'+str(i)+'.jpg',img_save)
3、截取背景
- 采用滑框,如256 * 256,128 * 128,通过与已有的区域的公共面积(IoU)来判断,如:选取IoU<0.3的区域作为背景,本实验中0.3效果不太好,所以选用IoU<0,即完全不重合。
size=128
def bg_cut(path_raw,path_label,path_save,color='red'):
if color=='red':
lower_hsv=np.array([