opencv(16) 访问图像中的像素

1. 图像在内存之中的存储方式

我们己经了解到图像矩阵的大小取决于所用的颜色模型,确切地说,取决于所用通道数。如果是灰度图像,矩阵就会如图所示。
在这里插入图片描述
而对多通道图像来说,矩阵中的列会包含多个子列,其子列个数与通道数相等。例如,如图所示RGB颜色模型的矩阵。
在这里插入图片描述
可以看到,OpenCV中子列的通道顺序是反过来的
BGR而不是RGB。很多情况下,因为内存足够大,可实现连续存储,因此,图像中的各行就能一行一行地连接起来,形成一个长行连续存储有助于提升图像扫描速度,我们可以使用isContinuous()来判断矩阵是否是连续存储的。

2. 颜色空间缩减

我们知道,若矩阵元素存储的是单通道像素,使用C或C++的无符号字符类型,那么像素可有256个不同值。但若是三通道图像,这种存储格式的颜色数就太多了(确切地说,有一千六百多万种用如此之多的颜色来进行处理,可能会对我们的算法性能造成严重影响。

其实,仅用这些颜色中具有代表性的很小的部分,就足以达到同样的效果。

如此,颜色空间缩减(colorspacereduction)便可以派上用场了,它在很多应用中可以大大降低运算复杂度。颜色空间缩减的做法是:将现有颜色空间值除以某个输入值,以获得较少的颜色数。也就是“做减法”,比如颜色值0到9可取为新值0,10到19可取为10,以此类推。

如uchar类型的三通道图像,每个通道取值可以是0-255,于是就有256256256个不同的值,我们可以定义:
0~9范围的像素值为0;
10~19范围的像素值为10:
20~29范围的像素值为20。

这样的操作将颜色取值降低为26×26×26种情况。这个操作可以用一个简单的公式来实现。因为C++中int类型除法操作会自动截余。例如Iold=14;
lnew=(lold/10)*10=(14/10)10=110=10;

uchar(无符号字符,即0到255间取值的数)类型的值除以int 值,结果仍是char。因为结果是char类型的,所以求出来小数也要向下取整。利用这一点,刚才提到在uchar定义域中进行的颜色缩减运算就可以表达为下面的形式:
I n e w = ( I o l d 10 ) ∗ 10 I_{new}=(\frac{I_{old}}{10})*10 Inew=(10Iold)10

因为C++中int类型除法操作会自动截余。比如:
Iold=14;
Inew=(Iold/10) * 10=(14/10) * 10=1 * 10=10;

在处理图像像素时,每个像素需要进行一遍上述计算,也需要一定的时间花销。但我们注意到其实只有0~255种像素,即只有256种情况。进一步可以把256种计算好的结果提前存在表中table中,这样每种情况不需计算,直接从table中取结果即可。

int divdeWith = 10;
uchar table[256];
for (int i = 0; i < 256; i++)
{
   
	table[i] = divdeWith*(i / divdeWith)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值