實現乙個ROI裁剪,最大程度減少背景區域的保留

2021-10-23 15:26:56 字數 4732 閱讀 8736

使用scikit-image包的相關函式來獲取原影象的聯通區域;

聯通區域有多個的時候,通過座標計算找到乙個框能夠框下多個連通區域;

得到這個框的座標作為裁剪大小的參考。

import os

import cv2

import sys

import numpy as np

from skimage import measure

import matplotlib.pyplot as plt

from matplotlib.patches import rectangle

# 獲取連通區域

defconnectcomponent

(bw_img)

: labeled_img, num = measure.label(bw_img, background=

0, connectivity=

1, return_num=

true

) lcc = np.array(labeled_img, dtype=np.uint8)

return lcc, num

defget_roi

(data_path)

: max_w =

0 max_h =

0 data_list = os.listdir(data_path)

for item in data_list:

mask = cv2.imread(os.path.join(data_path, item)

) max_value = np.

max(mask)

ret, bmask = cv2.threshold(mask,

1, max_value, cv2.thresh_binary)

lcc, num = connectcomponent(bmask)

props = measure.regionprops(lcc)

minc, minr, maxc, maxr = sys.maxsize, sys.maxsize,0,

0# 當有多個聯通區域時,通過處理座標,將所有前景都框在裡面

for i in

range

(len

(props)):

minr, minc, _, maxr, maxc, __ = props[i]

.bbox

minc, minr =

min(minc, minc)

,min

(minr, minr)

maxc, maxr =

max(maxc, maxc)

,max

(maxr, maxr)

# show all area's bbox

# fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))

# ax.imshow(mask, cmap='gray')

# lb = (minc, minr)

# w = maxc - minc

# h = maxr - minr

# bbox = rectangle(lb, w, h, fill=false, edgecolor='blue', linewidth=2)

# ax.add_patch(bbox)

fig, ax = plt.subplots(ncols=

1, nrows=

1, figsize=(6

,6))

ax.imshow(mask, cmap=

'gray'

) w = maxc - minc

h = maxr - minr

print

('w, h:'

, w, h)

# max_s = max(w, h)

# set_s = math.ceil(max_s / 16) * 16

# set_s = max_s

# w = set_s

# h = set_s

max_w =

max(w, max_w)

max_h =

max(h, max_h)

lb =

(minc, minr)

print

('crop w, h:'

, w, h)

bbox = rectangle(lb, w, h, fill=

false

, edgecolor=

'blue'

, linewidth=2)

ax.add_patch(bbox)

plt.ion(

) plt.pause(3)

plt.close(

) plt.show(

)print

('max_w, max_h:'

, max_w, max_h)

if __name__ ==

'__main__'

: get_roi(r'd:\learning\datasets\png\labels'

)

class

roicrop

(object):

def__init__

(self)

:pass

defconnectcomponent

(self, bw_img)

: labeled_img, num = measure.label(bw_img, background=

0, connectivity=

1, return_num=

true

) lcc = np.array(labeled_img, dtype=np.uint8)

return lcc, num

defget_bounding_box

(self, mask)

: stan = np.array(helpers.array_to_img(np.expand_dims(mask, axis=2)

))max_value = np.

max(stan)

ret, bmask = cv2.threshold(stan,

1, max_value, cv2.thresh_binary)

lcc, _ = self.connectcomponent(bmask)

props = measure.regionprops(lcc)

minc, minr, maxc, maxr = sys.maxsize, sys.maxsize,0,

0for i in

range

(len

(props)):

minr, minc, maxr, maxc = props[i]

.bbox

minc, minr =

min(minc, minc)

,min

(minr, minr)

maxc, maxr =

max(maxc, maxc)

,max

(maxr, maxr)

return minr, minc, maxr, maxc

def__call__

(self, img, mask)

:assert img.shape == mask.shape

minr, minc, maxr, maxc = self.get_bounding_box(mask)

w = maxc - minc

h = maxr - minr

leader =

max(w, h)

# 對裁剪大小進行約束,可選

crop_size = math.ceil(leader /16)

*16col, row = minc, minr

# visualization

# fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))

# ax.imshow(mask, cmap='gray')

# bbox = rectangle((col, row), crop_size, crop_size, fill=false, edgecolor='blue', linewidth=2)

# ax.add_patch(bbox)

# plt.show()

return img[row:row+crop_size, col:col+crop_size]

, mask[row:row+crop_size, col:col+crop_size]

做這個的初衷是,在做分割任務的時候想通過roi裁剪來減少背景區域所佔的比例,從而減少負樣本的數量。

不過roi裁剪必須要以ground truth為參考來裁剪原影象,而測試集是沒有ground truth的。

因此,這個想法也是暫時行不通用的。

不過在只考慮資料都有標籤的情況下,還是可以拿來實驗的。

就先暫時先放在這裡,說不定在其他地方能發揮作用呢^ ^。

乙個Linq效率(智慧型程度)的測試

今天做了一次linq的測試,如下 new dataclasses1datacontext in db.blogs 這是個較為複雜的查詢,包含兩個跨表聯合,更重要的是,最終需要的是count,而並不是整個blog列表,考驗的是linq的智慧型程度。用sql profile分析,得到對應的sql是 se...

實現乙個Semaphore

其實這是我boss的想法,我一開始聽他這麼說也覺得比較差異,ms已經寫好了何必再自己寫乙個.答案有兩個 1ms寫的東西未必就是最好的,如完成埠,heap等.2semaphore是多執行緒程式設計中的核心元素所以有必要提速.我們都知道在多執行緒中ms提供的多個現成阻塞核心物件中critical mon...

乙個Redis Cache實現

應用中需要通過http呼叫遠端的資料,但是這個獲取過程需要執行較長時間,而且這個資料本身的變化也不頻繁,這種情況最適合用乙個cache來優化。前兩年在做短鏈結實現的時候,曾經用最好的語言php做過乙個redis cache實現 乙個簡單的redis應用 修訂版 但那個畢竟是乙個特定的實現,而且我現在...