使用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應用 修訂版 但那個畢竟是乙個特定的實現,而且我現在...