- 20190925
-
博客背景
高分辨率图像为了方便处理,经常会有切分为小图的应用场景。在切分过程中总会有些小图中背景图像占很大一部分,需要再筛选过滤掉。
-
代码实现
此处只展示计算白色背景占比。
import cv2 import numpy as np from skimage import io import matplotlib.pyplot as plt import skimage.morphology as sm # import skimage.filters.rank as sfr def patch_white_percent(img): hsv=cv2.cvtColor(img,cv2.COLOR_RGB2HSV) # red_mask=cv2.inRange(hsv,np.array([156,43,46]),np.array([180,255,255])) # purple_mask=cv2.inRange(hsv,np.array([125,43,46]),np.array([155,255,255])) # blue_mask=cv2.inRange(hsv,np.array([100,43,46]),np.array([124,255,255])) # cyan_mask=cv2.inRange(hsv,np.array([78,43,46]),np.array([99,255,255])) # green_mask=cv2.inRange(hsv,np.array([35,43,46]),np.array([77,255,255])) # yellow_mask=cv2.inRange(hsv,np.array([26,43,46]),np.array([34,255,255])) # orange_mask=cv2.inRange(hsv,np.array([11,43,46]),np.array([25,255,255])) # # gray_mask=cv2.inRange(hsv,np.array([0,0,46]),np.array([180,43,220])) # # black_mask=cv2.inRange(hsv,np.array([0,0,0]),np.array([180,255,46])) # mask1=red_mask+purple_mask+blue_mask+cyan_mask+green_mask+yellow_mask+orange_mask+gray_mask+black_mask # mask1_temp = np.where(mask1>1,1,0) white_mask = cv2.inRange(hsv , np.array([0,0,221]) , np.array([180,30,255])) #### 因为白色是不需要的颜色,所以做了先开后闭的处理 dst = sm.opening(white_mask,sm.disk(5)) # dst = sfr.median(dst, sm.disk(3)) #中值滤波去小点(此处作用不大,可以省略) white = sm.closing(dst,sm.disk(5)) plt.subplot(221) plt.title('img') plt.imshow(org_thumnail) plt.subplot(222) plt.title('white_mask') plt.imshow(white_mask) plt.subplot(223) plt.title('white_end') plt.imshow(white) plt.show() #### 计算白色背景占比 mask1_temp = np.where(white>1,1,0) percent_temp = np.sum(mask1_temp)/(mask1_temp.shape[0]*mask1_temp.shape[1]) return percent_temp img = r"C:\Data\20190917_ndpi\20190925171451342_01_HER2_2816_4352.png" img = io.imread(img) percent_temp = patch_white_percent(img) print('#### percent_temp',percent_temp)
-
输入图像与结果展示
#### percent_temp 0.2086181640625