opencv 在python中有没有办法使用颜色曲线来操作图像?

kb5ga3dv  于 2022-11-15  发布在  Python
关注(0)|答案(3)|浏览(110)

I have a series of tif images and was wondering if there is a possibility to write something in python (using maybe scikit-image or OpenCV) to apply a color curve. The data I have looks like the following, where we have a list of x, y, x, y... data like so: (0, 0, 32, 22, 64, 56, 128, 128, 192, 196, 255, 255).

tyg4sfes

tyg4sfes1#

有了你提供的新信息,我认为下面的代码应该可以做到这一点。lut_in是输入灰度级的矢量,lut_out是所需的输出灰度级。(就像在photoshop中一样)。你唯一需要的是插值来有一个LUT(查找表),它适合输入的256个灰度级。您可以将相同的方法应用于其他颜色分辨率。

import cv2
import numpy as np

image = cv2.imread('apple.jpg')

lut_in = [0, 127, 255]
lut_out = [0, 80, 255]

lut_8u = np.interp(np.arange(0, 256), lut_in, lut_out).astype(np.uint8)
image_contrasted = cv2.LUT(image, lut_8u)

cv2.imwrite('apple_dark.jpg', image_contrasted)

输入:

输出量:

jchrr9hc

jchrr9hc2#

在评论中,有些人已经给出了如何将颜色LUT应用于图像的答案。但是当我读到你的问题时,我有一种印象,你实际上希望有一个2D色彩Map表,其中的颜色取决于两个参数。如果是这样的话,我建议访问this post或这个。希望这能有所帮助!

8wtpewkr

8wtpewkr3#

这里有一种使用python PIL而不是OpenCV来实现此目的的方法,以防有人像我一样偶然发现了这个答案,并且不想使用OpenCV。

import numpy as np
from PIL import Image

im = Image.open("apple.png").convert("RGBA")                                   
                                                                                                                                                                                                                                                                                                                                          
lut_x = [0, 127, 180, 255]                                                  
lut_y = [5, 80, 90, 255]                                                    
                                                                            
lut_u8 = np.interp(np.arange(0, 256), lut_x, lut_y).astype(np.uint8)        
                                                                            
R, G, B, A = [0, 1, 2, 3]                                                   
source = im.split()                                                         
out = []                                                                    
for band in [R, G, B]:                                                      
    out.append(source[band].point(lut_u8))                                  
out.append(source[A]) # Dont use LUT on the alpha band                      
                                                                            
merged_img = Image.merge('RGBA', out)                                       
merged_img.show()

相关问题