Rất đơn giản. Đoạn mã sau có thể được tối ưu hóa cao (tôi đã thực hiện nhanh chóng - @Silencer thực hiện điều này) và cũng hoạt động (đã thử nghiệm) với các hình ảnh khác (đối với một số hình ảnh, bạn sẽ phải điều chỉnh một số giá trị).
nhập khẩu cv2
nhập numpy dưới dạng np
# nhập hình ảnh
hình ảnh = cv2.imread('image.png')
cv2.imshow('bản gốc', hình ảnh)
cv2.waitKey(0)
hsv = cv2.cvtColor(hình ảnh, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', hsv[:, :, 1])
cv2.waitKey(0)
# cái này tính toán biểu đồ của hình ảnh bạn nhập
# nếu giá trị này ở dưới/dưới một giá trị nhất định (phụ thuộc vào màu sắc trong hình ảnh), một ngưỡng nhất định sẽ được chọn trong số một giá trị khác
lịch sử, thùng = np.histogram(hsv.ravel(), 256, [0, 256])
in(lịch sử[-1])
nếu lịch sử [-1] > 15000:
#nhị phân
ret, thresh = cv2.threshold(hsv[:, :, 0], 55, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
cv2.imshow('giây', thresh)
cv2.waitKey(0)
#sự giãn nở
kernel = np.ones((1, 1), np.uint8)
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('giãn nở', img_dilation)
cv2.waitKey(0)
#tìm đường nét
im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# sắp xếp đường viền
đã sắp xếp_ctrs = đã sắp xếp(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
đối với i, ctr trong enumerate(sorted_ctrs):
# Nhận hộp giới hạn
x, y, w, h = cv2.boundingRect(ctr)
#Nhận ROI
roi = hình ảnh[y:y + h, x:x + w]
# hiển thị ROI
# cv2.imshow('segment no:'+str(i),roi)
cv2.hình chữ nhật(hình ảnh, (x, y), (x + w, y + h), (0, 255, 0), 2)
#cv2.waitKey(0)
nếu w > 15 và h > 15:
cv2.imwrite('roi{}.png'.format(i), roi)
cv2.imshow('khu vực được đánh dấu', hình ảnh)
cv2.waitKey(0)
khác:
#nhị phân
ret, thresh = cv2.threshold(hsv[:, :, 0], 55, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow('giây', thresh)
cv2.waitKey(0)
#sự giãn nở
kernel = np.ones((1, 1), np.uint8)
img_dilation = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow('giãn nở', img_dilation)
cv2.waitKey(0)
#tìm đường nét
im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# sắp xếp đường viền
đã sắp xếp_ctrs = đã sắp xếp(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
đối với i, ctr trong enumerate(sorted_ctrs):
# Nhận hộp giới hạn
x, y, w, h = cv2.boundingRect(ctr)
#Nhận ROI
roi = hình ảnh[y:y + h, x:x + w]
# hiển thị ROI
# cv2.imshow('segment no:'+str(i),roi)
cv2.hình chữ nhật(hình ảnh, (x, y), (x + w, y + h), (0, 255, 0), 2)
#cv2.waitKey(0)
nếu w > 15 và h > 15:
cv2.imwrite('roi{}.png'.format(i), roi)
cv2.imshow('khu vực được đánh dấu', hình ảnh)
cv2.waitKey(0)
Tôi là một lập trình viên xuất sắc, rất giỏi!