Я работаю над проектом по обнаружению сплайсированных (фотошопированных) изображений и хочу, чтобы на границах поддельных областей были исправления размером 128x128. У меня есть подлинное фоновое изображение и поддельное.
Если я просто нахожу разницу в значениях пикселей и применяю пороговое значение для получения двоичного изображения, я получаю много шума (маленькие черные пятна в белой части и наоборот), которые не удаляются эффективно cv2.medianBlur()
,
Я предполагаю, что это из-за разных коэффициентов сжатия изображений до и после сращивания. Кроме того, некоторые пиксели в склеенной части аналогичны соответствующим пикселям в аутентификации. изображение.
Таким образом, я заменяю обычную функцию cv2.threshold()
, которая добавляет значения 4-соединенных соседей пикселя и сравнивает их с пороговым значением.
Это моя пороговая функция:
def threshold(image,thresh):
b,g,r= cv2.split(image)
res=np.zeros(b.shape,dtype=np.uint8)
#Not considering boundary pixels for the binary image
for i in range(1,b.shape[0]-1):
for j in range(1,b.shape[1]-1):
sumb = b[i][j] + b[i+1][j] + b[i-1][j] + b[i][j+1] + b[i][j-1]
sumg = g[i][j] + g[i+1][j] + g[i-1][j] + g[i][j+1] + g[i][j-1]
sumr = r[i][j] + r[i+1][j] + r[i-1][j] + r[i][j+1] + r[i][j-1]
res[i][j]=255 if sumb<=5*thresh or sumg<=5*thresh or sumr<=5*thresh else 0
res=res[1:-1,1:-1]
res=cv2.copyMakeBorder(res,1,1,1,1,cv2.BORDER_REFLECT_101)
return res
Это дает лучшие результаты, но не так хорошо, как ожидалось.
Например, это подлинное изображение:
Это склеенное изображение:
Это пороговое изображение (я обнаружил, что thresh=2
было оптимальным значением):
Я попытался удалить мелкие компоненты, удалив компоненты с несколькими белыми пикселями, используя connectedComponentsWithStats()
.
Это границы после удаления мелких подключенных компонентов:
в то время как ожидаемое изображение:
Я мог бы увеличить минимальное количество пикселей, необходимое для каждого компонента, но в моем наборе данных есть изображения, где кованая деталь мала.
Как я могу получить лучшие результаты, чем этот?
Кроме того, возможно ли оптимизировать мою функцию threshold
? Сейчас обработка одного изображения занимает не менее 2 секунд!