Магнитная полоса (черный прямоугольник) Обнаружение - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь обнаружить магнитную полосу кредитной карты, которая находится перед лицом человека.Сначала я попытался определить границы с помощью детектора краев Canny.Хотя видимый четкий край виден, обнаружение края не может обнаружить прекращенную границу.Ниже приведен код, который я набрал, чтобы получить результат:

img = cv2.imread(input_dir + str(f))

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.bilateralFilter(gray, 5, 10, 10)
edges = cv2.Canny(gray, 20, 60)

plt.subplot(121), plt.imshow(gray, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

enter image description here

Исходное изображение:

enter image description here

Желаемый результат (регион отмечен красным): enter image description here

Буду признателен за любую помощь.

Спасибо,

Нико

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Обновление:

Выполнен двойной порог после преобразования цветового пространства в HSV. Смотрите результаты ниже:

import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("img.jpg")

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_grey = np.array([0, 5, 50]) #Lower threshold for grey.
upper_grey = np.array([360, 50, 255]) #Higher threshold for grey.
mask = cv2.inRange(hsv, lower_grey, upper_grey)
img_res = cv2.bitwise_and(img, img, mask = mask)
img_res = cv2.GaussianBlur(img_res,(7,7),0)

edges = cv2.Canny(img_res, 100, 200)

plt.subplot(121), plt.imshow(img_res, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

**enter image description here**

Оригинал:

Во-первых, вы можете преобразовать цветовое пространство в HSV, а затем использовать размытие по Гауссу поверх него. enter image description here. Вот код, который я использовал:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("img.jpg")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
gray = cv2.GaussianBlur(gray[:,:,1],(7,7),0)
edges = cv2.Canny(gray, 20, 60)

plt.subplot(121), plt.imshow(gray, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
0 голосов
/ 24 июня 2019

Мое решение ограничено только этим изображением, где карта находится близко и горизонтально.

!wget https://i.stack.imgur.com/46VsT.jpg

прочитано на изображении.

import matplotlib.pyplot as plt
import numpy as np
import imageio

# rgb to gray https://stackoverflow.com/a/51571053/868736
im = imageio.imread('46VsT.jpg')
gray = lambda rgb : np.dot(rgb[... , :3] , [0.299 , 0.587, 0.114]) 
gray = gray(im)  
image = np.array(gray)
plt.imshow(image,cmap='gray')

enter image description here

import numpy as np
import skimage
from skimage import feature
from skimage.transform import probabilistic_hough_line
import matplotlib.pyplot as plt
from matplotlib import cm

найти горизонтальные ребра с некоторыми ограничениями.

edges = np.abs(skimage.filters.sobel_h(image))
edges = feature.canny(edges,1,100,200)
plt.imshow(edges,cmap='gray')

enter image description here

найти горизонтальные линии с большим количеством ограничений.

# https://scikit-image.org/docs/dev/auto_examples/edges/plot_line_hough_transform.html
lines = probabilistic_hough_line(edges, threshold=1, line_length=200,line_gap=100)
plt.imshow(edges * 0,cmap='gray')
for line in lines:
    p0, p1 = line
    plt.plot((p0[0], p1[0]), (p0[1], p1[1]),color='red')

enter image description here

использовать обнаруженные линии для получения интересующей области.

# https://scikit-image.org/docs/dev/auto_examples/edges/plot_convex_hull.html
from skimage.morphology import convex_hull_image
canvas = edges*0
for line in lines:
    p0, p1 = line
    canvas[p0[1],p0[0]]=1
    canvas[p1[1],p1[0]]=1
chull = convex_hull_image(canvas)
plt.imshow(chull,cmap='gray')

enter image description here

... но почему?;)

Я сомневаюсь, что вышеупомянутое решение на самом деле будет работать "в производстве" ... если у вас есть ресурс, я бы пошел на модифицированную модель YOLO и потратил бы ресурс на создание хорошего набора данных для обучения (акцент на "ХОРОШЕМ" наборе данных, но вы должны определить, что хорошего в первую очередь ...), посмотрите это видео для вдохновения, https://www.youtube.com/watch?v=pnntrewH0xg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...