Я пытаюсь определить углы сетки на различных изображениях, которые мне нужно обработать. Изображения могут быть искажены, а некоторые могут быть относительно хорошо ориентированы, но мы не можем гарантировать, что все изображения будут такими.
Чтобы определить углы сетки, я пытался использовать линии Хаф, но безрезультатно. Иногда линии Хафа не идентифицируют край сетки, и трудно определить, какие из нарисованных линий принадлежат краю сетки, а какие из них являются линиями сетки.
Затем я решил использовать контуры для определения краев сетки. Однако он обнаруживает многочисленные контуры и приводит к той же проблеме идентификации, которые находятся по углам среди всех идентифицированных контуров.
Чтобы помочь этому, я использовал двустороннюю фильтрацию, обнаружение краев Канни, морфологическое расширение и обнаружение краев Харриса, как видно из вопроса, аналогичного моей. Даже после применения всех этих мер, я все еще получаю тонны ложных углов, а иногда истинные углы не идентифицируются.
Мне было интересно, есть ли у кого-нибудь способ улучшить результаты моего обнаружения углов или кто-то имел в виду совершенно другое предположение, которое могло бы помочь решить мою проблему. Цель состоит в том, чтобы получить углы, чтобы я мог выполнить гомографию с использованием сетки 10 × 10, чтобы учесть перекос в изображениях. Это также поможет отобразить квадрат сетки в пиксельное пространство, что очень полезно.
Это мой код (немного небрежно с именами и всем, но я постараюсь исправить это позже). Кроме того, да, я сделал все возможное для двусторонней фильтрации, это, казалось, помогло избавиться от ненужных контуров и углов.
Мне также кажется, что я получаю одну ошибку при попытке применить линии Хафа к своему контурному изображению:
error: (-215) img.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function cv::HoughLinesStandard
from PIL import Image
import numpy as np
import cv2
import glob
#import images using opencv
images = [cv2.imread(file) for file in glob.glob("SpAMImages/*.jpg")]
for image in images:
#resizes image gotten from folder and performs bilateral filtering
img = cv2.bilateralFilter(cv2.resize(image, (715,715)), 15, 800, 800)
#applies a canny edge detection filter on the images loaded from the folder
gridEdges = cv2.Canny(img, 140, 170)
#apply image dilation
kernel = np.ones((5,5), np.uint8)
gridEdges = cv2.dilate(gridEdges, kernel, iterations=1)
gridEdges = np.float32(gridEdges)
gridEdges = cv2.blur(gridEdges,(10,10))
gridEdges = cv2.cornerHarris(gridEdges,2,3,0.04)
gridEdges = cv2.dilate(gridEdges,None)
img[gridEdges>0.01*gridEdges.max()]=[0,0,255]
#draw contours on current image
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contourImage, contours, hierarchy =
cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contour = cv2.drawContours(img, contours, -1, (0,255,0), 3)
'''
def largest_4_sided_contour(thresh, show_contours=True):
contourImage, contours, hierarchy =
cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
contour = cv2.drawContours(img, contours, -1, (0,255,0), 3)
contours = sorted(contours, key = cv2.contourArea, reverse = True)
for cnt in contours[:min(5, len(contours))]:
print(len(cnt))
if len(cnt) == 4:
return cnt
return None
print(largest_4_sided_contour(thresh))
#applies a hough transformation to extract gridlines from the image
-----------THIS LINE BELOW GIVES ME THE ERROR-----------------
lines = cv2.HoughLines(img, 1, np.pi/180, 245)
#iterates through an array of lines gottne from the hough transform
#and draws them unto the image
for i in range(len(lines)):
for rho,theta in lines[i]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
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),2)
cv2.imwrite('houghlines.jpg', img)
'''
#resize window because for some reason they are too large.
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.resizeWindow('image', 800, 800)
#display all the images produced from above processes
cv2.imshow('image', img)
cv2.imshow('dilated edges', gridEdges)
#cv2.imshow('contour', contour)
cv2.waitKey(0)
'''
retrieve image size from imported image.
testImageWidth, testImageHeight = img.shape[:2]
print(testImageHeight, testImageWidth)'''
Это некоторые изображения, полученные в результате моей попытки получения углов с помощью обнаружения контуров и обнаружения углов Харриса.
Определение углов с помощью контуров и определение угла Харриса:
И несколько примеров изображений, с которыми мне приходится работать.
Пример сетки:
Скошенная сетка:
Заранее спасибо за любую помощь !!!