Я пытаюсь использовать openCV и python, чтобы извлечь детали изображения и затем сохранить его в формате CSV. Поскольку было бы повысить точность распознавания текста для извлечения данных из текста, я пытаюсь предварительно обработать изображение и создать вид с высоты птичьего полета. Изображение имеет много шума и фон похож на цвет интересующей области.
Исходное изображение
![enter image description here](https://i.stack.imgur.com/IEWcj.jpg)
Подход 1) Я использовал размытие по Гауссу с последующей адаптивной настройкой порога, чтобы избавиться от некоторого шума. Затем следуют морфологические преобразования, чтобы получить честное двоичное изображение. Затем я искал контуры в этой области, используя внешнюю иерархию, а затем отсортировал по области. Кроме того, контуры, которые создаются на краях карты, открыты и, следовательно, сортировка по областям не работает так, как я ожидал. Но я не смог придумать желаемый результат.
def pre_process_image(img, skip_dilate=False):
proc = cv2.GaussianBlur(img.copy(), (9, 9), 0)
# ret, proc = cv2.threshold(proc,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# edged = cv2.Canny(proc, 100, 200)
proc = cv2.adaptiveThreshold(proc, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
if not skip_dilate:
kernel = np.array([[0., 1., 1.], [1., 1., 1.], [1., 1., 0.]], np.uint8)
proc = cv2.dilate(proc, kernel)
# proc = cv2.erode(proc.copy(), cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)), iterations = 1)
return proc
processed = pre_process_image(res.copy())
contours = cv2.findContours(processed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Find contours
contours = imutils.grab_contours(contours)
contours = sorted(contours, key = cv2.contourArea, reverse = True)
max_len = 0
for cnt in contours:
if(cv2.arcLength(cnt, False) > max_len):
max_len = cv2.arcLength(cnt, False)
connt = cnt
p = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
external_only = cv2.drawContours(p.copy(), connt, -1, (255, 0, 0), 2)
![LOL epic Fail](https://i.stack.imgur.com/TmdHu.png)
Подход 2) HoughTransform для определения краев после базовой обработки c
blur = cv2.GaussianBlur(img, (9, 9), 0)
# res = cv2.equalizeHist(blur)
# res2 = np.hstack((gray, tut))
# # Apply edge detection method on the image
edges = cv2.Canny(blur,50,150,apertureSize = 3)
lines = cv2.HoughLines(edges,1,np.pi/180, 50)
for r,theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*r
y0 = b*r
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
cv2.line(img,(x1,y1), (x2,y2), (0,0,255),4)
![lol fail](https://i.stack.imgur.com/V4nf6.png)
Было бы очень полезно, если бы кто-то мог указать на мои ошибки и использовать гораздо более эффективный способ достижения Хорошие результаты. Я новичок в обработке изображений, поэтому, возможно, не знаю о большей части теории, но очень важно получить хорошее направление для дальнейшей работы. ТИА!