小地瓜重新去华容道工作

小地瓜重新去华容道工作

opencv颜色映射表操作-applyColorMap()和LUT()函数使用介绍

人眼对颜色的变化更敏感,所以当一张灰度图的细微变化不是很明显时,可以对灰度图重新着色。

opencv提供函数applyColorMap()实现这种功能。其内部算法基本是查表法LUT实现,首先构建查找表,然后应用查找表。应用表的过程类似: d s t ( i , j ) = L U T ( s r c ( i , j ) ) dst(i,j) = LUT(src(i,j)) dst(i,j)=LUT(src(i,j)),LUT是事先创建好的表,每一个像素值都有它对应的值。

比如我们都知道Gamma校正, d s t = K ∗ E r = 255 ∗ E ( l o g ( p ( x , y ) / 255 ) ∗ g a m m a dst = K*E^r = 255 * E^{(log(p(x,y)/255)*gamma} dst=KEr=255E(log(p(x,y)/255)gamma, p ( x , y ) p(x,y) p(x,y)就是图像中坐标为(x,y)点处的像素值。

函数applyColorMap()声明如下:

C++

void cv::applyColorMap(InputArray src,OutputArray dst,int colormap);

void cv::applyColorMap(InputArray src,OutputArray dst,InputArray userColor);

python:

cv.applyColorMap(src, colormap[, dst]) ->	dst
cv.applyColorMap(src, userColor[, dst]) ->	dst

参数说明:

  • src,原始图像,灰度图或彩色图,图片格式为CV_8UC1或CV_8UC3(opencv4.5.4版本);
  • dst,色彩重映射后的图像;
  • colormap,应用的colormap,值为枚举类型ColormapTypes;
  • userColor,自定义的colormap,可以是CV_8UC1或CV_8UC3,大小为256

ColormapTypes枚举值:

【opencv】颜色映射表操作-applyColorMap()和LUT()函数使用介绍-LMLPHP

使用示例,使用滑动条改变colorMap类型,观察每种类型的图片输出结果

def ColorMap_demo():
    img = cv.imread("lena.jpg",cv.IMREAD_GRAYSCALE)
    if img.shape[0]==0:
        print("load image fail!")
        return
    windowname="applyColorMap"
    cv.namedWindow(windowname,cv.WINDOW_AUTOSIZE)
    pos=0
    cv.createTrackbar("Type",windowname,pos,22,callback_trackbar)
    while True:
        pos = cv.getTrackbarPos("Type",windowname)
        imgdst = np.copy(img)
        if pos != 0 :
            imgdst = cv.applyColorMap(img,pos-1)
        cv.imshow(windowname,imgdst)
        if cv.waitKey(10) == 27:
            break
if __name__ == "__main__":
    ColorMap_demo()

函数cv::LUT()执行数组的查找表转换,函数声明:

// C++:
void cv::LUT(InputArray src, InputArray lut, OutputArray dst)		
# Python:
cv.LUT(	src, lut[, dst]	) ->	dst

参数说明:

  • src,8bit输入
  • lut,查找表,要与src保持通道一致;256个元素
  • dst,输出数组,大小和通道数与src一致,深度与LUT一致;

使用示例,gamma校正

def Gamma_LUT():
    # 构建查找表
    gamma = 0.7
    lut = np.zeros((256,1,3), dtype=np.uint8)  # 建立查找表
    for i in range(256):
        # print(i,'--',np.log(i/255.0))
        if i == 0:
            lut[i] = (0,0,0)
        else:
            tmp = int(np.exp(np.log(i / 255.0) * gamma) * 255.0)  # dst = K*E^r = 255 * E^(log(p(x,y)/255)*gamma
            lut[i]=(tmp,tmp,tmp)
    print(lut)
    # 应用表数据
    img = cv.imread("butterfly.jpg")
    cv.imshow("input", img)
    imgdst = cv.LUT(img,lut)
    cv.imshow("output_gamma", imgdst)
    cv.imwrite("lut2.jpg",imgdst)
    cv.waitKey(0)

if __name__ == "__main__":
    Gamma_LUT()

显示结果:

【opencv】颜色映射表操作-applyColorMap()和LUT()函数使用介绍-LMLPHP

11-14 06:57