Заполнение дыр в изображении с помощью OpenCV или Skimage

Я пытаюсь заполнить отверстия для шахматной доски для стереоприложения. Шахматная доска находится в микромасштабе, поэтому сложно избежать пыли... как вы можете видеть:

введите здесь описание изображения

Таким образом, обнаружение углов невозможно. Я пробовал использовать бинарные_заполнения SciPy или аналогичные подходы, но у меня есть полностью черное изображение, я не понимаю.


person user3601754    schedule 24.09.2016    source источник
comment
Попробуйте использовать открытие   -  person PSchn    schedule 24.09.2016
comment
Или инвертируйте изображение, используйте поиск контуров, залейте их черным цветом и снова инвертируйте.   -  person PSchn    schedule 24.09.2016


Ответы (2)


Вот функция, которая заменяет цвет каждого пикселя на цвет большинства соседних пикселей.

import numpy as np
import cv2

def remove_noise(gray, num):
    Y, X = gray.shape
    nearest_neigbours = [[
        np.argmax(
            np.bincount(
                gray[max(i - num, 0):min(i + num, Y), max(j - num, 0):min(j + num, X)].ravel()))
        for j in range(X)] for i in range(Y)]
    result = np.array(nearest_neigbours, dtype=np.uint8)
    cv2.imwrite('result2.jpg', result)
    return result

Демо:

img = cv2.imread('mCOFl.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

remove_noise(gray, 10)

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

введите здесь описание изображения

Выход:

введите здесь описание изображения

Примечание. Поскольку эта функция также заменяет цвет угловых пикселей, вы можете использовать функцию cv2.goodFeaturesToTrack, чтобы найти углы и ограничить шумоподавление для этих пикселей.

corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 30)
corners = np.squeeze(np.int0(corners))
person kasravnd    schedule 24.09.2016
comment
Спасибо за интересные результаты! :) Это работает хорошо, но недостатком является диффузия по углам, которая, я думаю, приводит к увеличению ошибок. Может быть, я мог бы эрозии после вашей коррекции? - person user3601754; 24.09.2016
comment
Я думал о медианном фильтре, но он ведет к той же проблеме. - person user3601754; 24.09.2016
comment
@user3601754 user3601754 Да, я собирался добавить объяснение по этому поводу. Я думаю, что есть способ отказаться от этого, найдя углы и избегая операции над ними. - person kasravnd; 24.09.2016
comment
Да, я не могу обнаружить углы с помощью функции cv2.findChessboardCorners :( - person user3601754; 24.09.2016
comment
Разве это почти то же самое, что просто размыть изображение? - person PSchn; 24.09.2016
comment
@PSchn Да, вроде того. - person kasravnd; 25.09.2016
comment
Так почему бы не использовать открывание?! Отверстия будут заполнены, а форма останется неизменной. Или используйте метод, который я упоминал выше. - person PSchn; 25.09.2016

Вы можете использовать морфологию: расширять, а затем разрушать с тем же размером ядра.

person Andrey Smorodov    schedule 25.09.2016