5.1.2颜色空间缩减
python代码:
# -*- coding: utf-8 -*-
__author__ = 'sunzhilong'
import cv2
import numpy as np
# 对图像中的像素表达进行量化。
# 如常见的RGB24图像有256×256×256中颜色,通过Reduce Color将每个通道的像素减少8倍至256/8=32种,则图像只有32×32×32种颜色。
# 假设量化减少的倍数是N,则代码实现时就是简单的value/N*N,通常我们会再加上N/2以得到相邻的N的倍数的中间值,
# 最后图像被量化为(256/N)×(256/N)×(256/N)种颜色。
# divideWith = 32 # 量化减少的倍数
# table = []
# for i in range(256):
# data = divideWith//2 + divideWith * (i//divideWith) # 地板除,只返回整数部分 255//10 = 25
# table.append(data)
srcImage = cv2.imread("E:/Study/python/OpenCV_study/img/7.jpg")
desImage = srcImage.copy()
timer = cv2.getTickCount()
for i in range(desImage.shape[0]):
for j in range(desImage.shape[1]):
desImage[i,j] = 32 * (desImage[i, j]//32) + 32/2
timer = (cv2.getTickCount() - timer)/ cv2.getTickFrequency()
print(timer) # 2.2578728153440797
# 更推荐这种函数先计算出量化范围,遍历图像时,直接赋值
desImage2 = srcImage.copy()
divideWith = 32 # 量化减少的倍数
timer = cv2.getTickCount()
table = []
for i in range(256):
data = divideWith//2 + divideWith * (i//divideWith) # 地板除,只返回整数部分 255//10 = 25
table.append(data)
for i in range(desImage2.shape[0]):
for j in range(desImage2.shape[1]):
desImage2[i, j][0] = table[desImage2[i, j][0]]
desImage2[i, j][1] = table[desImage2[i, j][1]]
desImage2[i, j][2] = table[desImage2[i, j][2]]
timer = (cv2.getTickCount() - timer)/ cv2.getTickFrequency()
print(timer) # 1.0115957501014972
# 最推荐使用这种内部查找、替换函数LUT
desImage3 = srcImage.copy()
divideWith = 32 # 量化减少的倍数
timer = cv2.getTickCount() # 获取时间节点
# 构造对应矩阵。假设量化减少的倍数是N,则代码实现时就是简单的value/N*N,通常我们会再加上N/2以得到相邻的N的倍数的中间值,
table = np.array([ divideWith//2 + divideWith*(i//divideWith) for i in range(256)], dtype=np.uint8)
# 这个地方还有个坑。在构建table数据的时候,一定要设置数据类型。因为OpenCV默认读取的图像像素数据类型都是uint8,
# 而np.atrry构造的数据默认是uint32。如果table里的数据类型跟像素的数据类型不一致时,LUT函数是处理不了的。
# print(type(table[0]))
# print(type(srcImage[0][0][0]))
cv2.LUT(srcImage, table, desImage3) # 将srcImage数据,根据table里的对应关系进行查找、替换,输出到desImage3中。
timer = (cv2.getTickCount() - timer)/ cv2.getTickFrequency() # 获取运行时间
print(timer) # 0.0013367226010904173
print(srcImage[100][200], desImage[100][200], desImage2[100][200], desImage3[100][200])
cv2.imshow("srcImage", srcImage)
cv2.imshow("desImge", desImage)
cv2.imshow("desImge2", desImage2)
cv2.imshow("desImge3", desImage3)
cv2.waitKey(0)