Применение исходных пикселей изображения везде, где пороговое изображение является черным в OpenCV / numpy?

#python #numpy #opencv #image-processing

#python #numpy #opencv #обработка изображений

Вопрос:

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

 import cv2
import numpy as np

img = cv2.imread("img01.jpg")
empty_image = np.zeros([img.width,img.height,3],dtype=np.uint8)
grey = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

ret,thresh1 = cv2.threshold(grey,125,255,cv2.THRESH_BINARY)
kernel = np.ones((5, 5), np.uint8) 
mask = cv2.erode(thresh1, kernel, iterations=2)
mask = cv2.dilate(mask, kernel, iterations=2)
for(i in mask):
      if(mask[i]>0]:
          empty_image[i]=img[i]
 

Другими словами: как я могу восстановить части исходного изображения в части порогового изображения?

Ответ №1:

После нахождения маски просто используйте result = cv2.bitwise_and(img,img,mask=mask) без необходимости объявлять пустое изображение, которое называется процессом маски.

Другой способ — использовать логическую индексацию, img[mask==0] = 0 чтобы сделать каждый пиксель изображения нулевым (черным), если он черный в маске.

И это результат:

результат применения маски к изображению

Эта ссылка для полезного примера для понимания bitwise_and и других простых связанных операций в opencv документах.

Комментарии:

1. Это именно то, на что я надеялся! Большое спасибо. Я действительно не слишком старался разобраться в цикле выполнения действий, потому что для этого конкретного проекта O (n) слишком медленный!

2. да, лучше избегать использования цикла for , вы можете решить это с помощью нарезки, img[mask==0] = 0 чтобы сделать каждый пиксель исходного изображения черным, если он черный в маске.