“毛星云OpenCV3编程入门之python实现”第八篇颜色空间缩减

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值