Вы можете использовать следующий подход, если ваша цель - определить область белой книги.Здесь пороговое значение на изображении HED сначала применяется для генерации двоичного изображения, а также для уменьшения шума.После этого, применение HoughLinesP к двоичным линиям изображения HED обнаруживается.Обратите внимание, что параметры (например, minLineLength) HoughLinesP настроены для этого размера изображения.
hed_binary = cv2.threshold(hed, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] # holistically nested edge image is in gray scale
lines = cv2.HoughLinesP(hed_binary, rho=1, theta=1*np.pi/180, threshold=2300, minLineLength=1000, maxLineGap=10)
for i in range(lines.shape[0]):
x1 = lines[i][0][0]
y1 = lines[i][0][1]
x2 = lines[i][0][2]
y2 = lines[i][0][3]
cv2.line(original, (x1, y1), (x2, y2), (0, 0, 255), 2)
Вывод этого подхода:
Youтакже можно использовать следующий подход, в котором двоичное изображение генерируется из изображения в оттенках серого с последующим обнаружением контуров.
gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (7,7), 0)
binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnt = None
max_area = x = y = w = h = 0
for c in cnts:
area = cv2.contourArea(c)
if area > max_area:
x, y, w, h = cv2.boundingRect(c)
max_area = area
cnt = c
cv2.drawContours(original, [cnt], 0, (0, 255, 0), 3)
cv2.rectangle(original, (x,y), (x+w, y+h), (255, 0, 0), 3)
Вывод: