OpenCV: обнаружение квадратов на темном фоне - PullRequest
5 голосов
/ 28 мая 2020

в настоящее время пытаюсь рассчитать оптические потоки движущихся объектов. объекты, в частности, квадраты вокруг круглых ручек:

The red outlines are where you should see the squares

Вот ванильное изображение, которое я пытаюсь обработать: Normal image. Check the image with the red squares to see where the squares I wish to detect are

Меня беспокоит самая правая нижняя полоса. Два квадрата обычно не могут быть обнаружены, когда я пробовал обнаружение Canny Edge или GoodFeaturesToTrack. В настоящее время я пытаюсь сделать ядро ​​резкости и порог, а затем морфологическое преобразование, чтобы найти области контура. Однако, когда я порог, я получаю следующие результаты:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt


filename = 'images/Test21_1.tif'


image = cv.imread(filename)

kernel = [ [0, -1, 0], [-1, 5, -1], [0, -1, 0] ] #sharpen kernel I got from wikipedia

kernel = np.array(kernel)
dst = cv.filter2D(image, -1, kernel)
ret, thresh = cv.threshold(dst, 80, 150, cv.THRESH_BINARY_INV)

plt.subplot(121),plt.imshow(image),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(thresh),plt.title('Threshold')
plt.xticks([]), plt.yticks([])
plt.show()

result from my code with thresholding

Мне было интересно, что я могу сделать в openCV, чтобы распознать это квадрат. Эти квадраты - объекты, которые движутся на видео, и я буду sh использовать их для расчета их оптического потока. В настоящее время я рассматриваю возможность использования PyTorch CNN для обнаружения этих функций. Я бы вручную пометил изображения для тренировочных / тестовых наборов данных, но я считаю, что это может быть немного излишним. Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Я не уверен, что это лучше, но вы можете попробовать использовать технику нормализации деления в Python / OpenCV.

  • Прочитать ввод
  • Преобразовать в оттенки серого
  • Применить морфологию
  • Разделить ввод на результат морфологии
  • Adaptive Threshold
  • Сохранить результаты


import cv2
import numpy as np

# read the image
img = cv2.imread('rods.png')

# convert to gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# apply morphology
kernel = cv2.getStructuringElement(cv2.MORPH_RECT , (5,5))
smooth = cv2.morphologyEx(gray, cv2.MORPH_DILATE, kernel)

# divide gray by morphology image
division = cv2.divide(gray, smooth, scale=255)

# threshold
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 4)

# save results
cv2.imwrite('rods.division.jpg',division)
cv2.imwrite('rods.thresh.jpg',thresh)

# show results
cv2.imshow('smooth', smooth)  
cv2.imshow('division', division)  
cv2.imshow('thresh', thresh)  
cv2.waitKey(0)
cv2.destroyAllWindows()


Изображение деления:

enter image description here

Пороговое изображение:

enter image description here

1 голос
/ 28 мая 2020

Проблема в том, что у правого нижнего квадрата плохой локальный контраст. Можете ли вы попробовать с помощью CLAHE (адаптивное выравнивание гистограммы с ограничением контраста).

# improving local contrast
GRID_SIZE = 20
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(GRID_SIZE,GRID_SIZE))
image = clahe.apply(image)

Затем попробуйте использовать свой алгоритм для обнаружения квадратов.

...