用python从图像中提取颜色

用python从图像中提取颜色,python,image,opencv,image-processing,python-imaging-library,Python,Image,Opencv,Image Processing,Python Imaging Library,我有一个黑白图像和相同的彩色笔划图像。我想做的是提取颜色笔划,模糊它们,然后将原始图像与模糊图像混合。我通过相互减去两幅图像来提取颜色笔划,但我在黑色背景上获得这些颜色笔划,而我需要它们在白色上与原始图像混合。这是我代码的一部分: def imageblur(cimg): return cv2.blur(cimg, (50, 50)) bw = glob('path1') colorful = glob('path2') output_dir = 'path3' index = 0

我有一个黑白图像和相同的彩色笔划图像。我想做的是提取颜色笔划,模糊它们,然后将原始图像与模糊图像混合。我通过相互减去两幅图像来提取颜色笔划,但我在黑色背景上获得这些颜色笔划,而我需要它们在白色上与原始图像混合。这是我代码的一部分:

def imageblur(cimg):
    return cv2.blur(cimg, (50, 50))


bw = glob('path1')
colorful = glob('path2')
output_dir = 'path3'
index = 0


for i,j in zip(bw, colorful):
    img1 = cv2.imread(i)
    img2 = cv2.imread(j)
    color = cv2.subtract(img1,img2)
    color = imageblur(color)
    mask = Image.fromarray(np.uint8(color))
    img = Image.fromarray(np.uint8(img1))
    im = Image.blend(img, mask, 0.5)
    #color = img1 + color
    im.save(os.path.join(output_dir, str(index) + '.jpg'))
    index += 1
    print(index)

示例

如果要将RGB图像的背景从黑色更改为白色,可以执行以下操作:

#thresholds all black color in your "color-on-black-background" image 
#to maximum value (255,255,255) (white) and sets the rest (yours colors) 
#to (0,0,0) (black)
thresholded=cv2.inRange(img,(0,0,0),(0,0,0))
#add both images
res=img+cv2.cvtColor(thresholded,cv2.COLOR_GRAY2BGR)
输入(img):

阈值化(阈值化):


输出(分辨率):

如果要将RGB图像的背景从黑色更改为白色,可以执行以下操作:

#thresholds all black color in your "color-on-black-background" image 
#to maximum value (255,255,255) (white) and sets the rest (yours colors) 
#to (0,0,0) (black)
thresholded=cv2.inRange(img,(0,0,0),(0,0,0))
#add both images
res=img+cv2.cvtColor(thresholded,cv2.COLOR_GRAY2BGR)
输入(img):

阈值化(阈值化):


输出(res):

使用样本图像获得结果。处理过程略有改变

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

def show(title, img, color=True):
    if color:
        plt.imshow(img[:,:,::-1]), plt.title(title), plt.show()
    else:
        plt.imshow(img, cmap='gray'), plt.title(title), plt.show()

img = cv2.imread('color_strokes.jpg')
show('original', img)

mask=cv2.inRange(img,(0,0,0),(150,150,150))
show('mask', mask, False)

res=255-cv2.cvtColor(mask,cv2.COLOR_GRAY2BGR)
show('result', res, False)
输出:


使用示例图像获得结果。处理过程略有改变

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

def show(title, img, color=True):
    if color:
        plt.imshow(img[:,:,::-1]), plt.title(title), plt.show()
    else:
        plt.imshow(img, cmap='gray'), plt.title(title), plt.show()

img = cv2.imread('color_strokes.jpg')
show('original', img)

mask=cv2.inRange(img,(0,0,0),(150,150,150))
show('mask', mask, False)

res=255-cv2.cvtColor(mask,cv2.COLOR_GRAY2BGR)
show('result', res, False)
输出:


您预期会发生什么?255(白色)-255(白色)=0(黑色)。你有自己的想法吗?或者你只是想被填鸭式地灌输一个解决方案?你期望发生什么?255(白色)-255(白色)=0(黑色)。你有自己的想法吗?还是你只是想被灌输一个解决方案?