Python 在OpenCV/numpy中,在阈值图像为黑色的位置应用原始图像像素?

Python 在OpenCV/numpy中,在阈值图像为黑色的位置应用原始图像像素?,python,numpy,opencv,image-processing,Python,Numpy,Opencv,Image Processing,我已经对阈值图像应用了一些形态学操作,现在我想将其转换回原始图像,但仅限于图像为黑色的地方。下面是一些我试图做的伪代码示例: 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,th

我已经对阈值图像应用了一些形态学操作,现在我想将其转换回原始图像,但仅限于图像为黑色的地方。下面是一些我试图做的伪代码示例:

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]

换句话说:如何将原始图像的一部分还原为阈值图像的一部分?

找到掩码后,只需使用
result=cv2.bitwise_和(img,img,mask=mask)
,无需声明空图像,这称为掩码处理

另一种方法是使用布尔索引,如
img[mask==0]=0
,使每个图像像素在掩码中为黑色时为零(黑色)

这就是结果:


这是理解
opencv
docs中的
bitwise\u和
以及其他简单相关操作的有用示例。

这正是我所希望的!谢谢。我真的没有太努力地去研究做事情的for循环,因为对于这个特定的项目,O(n)太慢了!是的,最好避免使用for循环,您可以通过切片解决它,如
img[mask==0]=0
,使原始图像的每个像素都变黑(如果它在遮罩中是黑色的)。