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=K∗Er=255∗E(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枚举值:
使用示例,使用滑动条改变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()
显示结果: