Я пытаюсь найти региональный максимум на этом изображении:
, чтобы сделать разрез в своей позиции следующим образом:
Я нашел способ фильтрации региональных максимумов здесь , но я не могу заставить его работать для моего случая.
Мой код:
import numpy as np
import cv2
import skimage as sm
from skimage.morphology import reconstruction
import scipy as sp
img = cv2.imread('img.png', 0)
img = sm.img_as_float(img)
img = sp.ndimage.gaussian_filter(img, 1)
seed = np.copy(img)
seed[1:-1,1:-1] = img.min()
mask = img
dilated = reconstruction(seed, mask, method = 'dilation')
img = img - dilated
cv2.imshow('img', img)
cv2.waitKey()
Мое решение:
import numpy as np
import cv2
img = cv2.imread('img.png', 0)
_, thresh = cv2.threshold(img, 250, 255, cv2.THRESH_BINARY)
rows = np.sum(thresh/255, axis = 1)
ol = len(np.nonzero(rows)[0])
L = []
z = 0
for idx, row in enumerate(rows):
if row > 0:
if z > 5 and z < ol - 5:
L.append(idx)
z += 1
split = np.min(rows[L])
thresh[np.where(rows == split)[0][0]] = 0
cv2.imshow('img', thresh)
cv2.waitKey()
HansHirse написал более профессиональный подход:
import numpy as np
import cv2
img = cv2.imread('img.png', 0)
_, thresh = cv2.threshold(img, 250, 255, cv2.THRESH_BINARY)
rows = np.sum(thresh/255, axis = 1)
exclude = 5
idx = np.where(rows > 0)[0]
idx = idx[exclude : len(idx) - exclude]
cut = idx[np.argmin(rows[idx])]
thresh[cut] = 0
cv2.imshow('img', thresh)
cv2.waitKey()
Оба результата дают:
Было бы интересно увидеть подход, который не ограничивается горизонтальными пикселями.