В настоящее время я работаю над проектом по измерению уровня воды в открытом канале с обработкой изображений.Моя главная проблема заключается в том, что мне приходится работать над довольно проблемными изображениями из-за наших лабораторных условий.(т.е. плохое освещение, плохой фон и т. д.)
В настоящее время это лучшее изображение, которое у меня есть, в будущем я получу лучшие, но пока это то, что яя работаю с.
Поскольку на снимке так много всего, я решил отфильтровать синий цвет, чтобы нарисовать некоторые контуры и выбрать те, над которыми мне нужно работать.Но я не могу обойти это достаточно хорошо, чтобы обнаружить каждый синий прямоугольник.Я также попытался просто отобразить изображение в градациях серого, а затем нарисовать контуры, что, кажется, работает лучше, но все же недостаточно.Для измерения я планирую использовать Hough Transform.
Мой вопрос;Я неправильно подхожу к этому, или изображение, с которым я сейчас работаю, просто недостаточно хорошо для работы?Стоит ли пробовать разные библиотеки или языки?Вот мой текущий код:
from imutils import perspective
from imutils import contours
import numpy as np
import imutils
import cv2 as cv
blueLow = np.array([90, 50, 20])
blueHigh = np.array([130, 255, 255])
img = cv.imread("10ltsn.png")
imgHSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)
mask = cv.inRange(imgHSV, blueLow, blueHigh)
##imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
##kernelOpen = np.ones((5,5))
##kernelClose = np.ones((20,20))
##maskOpen = cv.morphologyEx(mask, cv.MORPH_OPEN, kernelOpen)
##maskClose = cv.morphologyEx(maskOpen, cv.MORPH_CLOSE, kernelClose)
##imgray = cv.GaussianBlur(imgray, (5,5), 0)
##imgray = cv.bilateralFilter(imgray,9,75,75)
edge = cv.Canny(mask, 50, 200)
edge = cv.dilate(edge, None, iterations=1)
edge = cv.erode(edge, None, iterations=1)
cnt = cv.findContours(edge.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnt = imutils.grab_contours(cnt)
##(cnt, _) = contours.sort_contours(cnt)
for k in cnt:
if cv.contourArea(k) < 1000:
continue
main = img.copy()
box = cv.minAreaRect(k)
box = cv.boxPoints(box)
box = np.array(box, dtype="int")
box = perspective.order_points(box)
cv.drawContours(main, [box.astype("int")], -1, (0, 255, 0), 1)
for (x, y) in box:
cv.circle(main, (int(x), int(y)), 5, (0, 0, 255), -1)
cv.imshow("main", main)
cv.waitKey(0)
##cv.imshow("img", img)
##cv.imshow("mask", mask)
##cv.imshow("mask2", mask2)
##cv.imshow("edge", edged)
##cv.imshow("maskClose", maskClose)
##cv.imshow("maskOpen", maskOpen)
##cv.waitKey(0)
cv.destroyAllWindows()