OpenCV之像素访问(2)

通过指针访问图像数据

(1)通过uchar *data=src.ptr<uchar>(line_number);获取所要处理的像素点所在行数

(2)data[i]就可以获得图像中某一行中第j行、第i/3个像素的第i%3通道的灰度值,其中:
0=<i<image.cols*image.channels()

例程 :Color Reduce算法

#include"opencv2/highgui/highgui.hpp"

#include"opencv2/core/core.hpp"
#include<iostream>
usingnamespacecv;
usingnamespacestd;
voidcolorReduce1(Mat&image,intdiv=64) {
intnl=image.rows;
intnc=image.cols*image.channels();
for(intj=0;j<nl;j++) {
uchar*data=image.ptr<uchar>(j);
for(inti=0;i<nc;i++) {
data[i]=data[i]/div*div+div/2;
}
}
}
int_tmain(intargc,_TCHAR*argv[])
{
Matsrc=imread("D:\\1.jpg");
Matoutput;
src.copyTo(output);
if(!src.data)
{
cout<<"Image loading failed"<<endl;
}
colorReduce1(output,32);
namedWindow("src",WINDOW_AUTOSIZE);
namedWindow("output",WINDOW_AUTOSIZE);
imshow("output",output);
imshow("src",src);
waitKey(0);
return0;
}
程序运行结果:
如果div的数目为2的整数幂,则还可以通过移位预算,增加程序的执行效率,修改后代码如下:
voidcolorReduce2(Mat&image,intn=6) {
intnl=image.rows;
intnc=image.cols*image.channels();
intdiv= (int)pow(2.0f,n);
ucharmask= 0xFF<<n;//与mask进行与运算,相当于对低n位进行清零
for(intj=0;j<nl;j++) {
uchar*data=image.ptr<uchar>(j);
for(inti=0;i<nc;i++) {
data[i]= (data[i]&mask) + div/2;
}
}
}
为了进一步提高执行效率, 可以通过isContinuous方法来判断图像是否为连续图像,如果返回值是TRUE,则代表其是连续图像, 对于连续图像而言,在图像像素扫描时的双层循环改为单层循环,进一步提高执行效率
voidcolorReduce3(Mat&image, intn=6) {
intnl= image.rows;
intnc= image.cols* image.channels();
intdiv = (int)pow(2.0f,n);
ucharmask = 0xFF<<n;
if(image.isContinuous())
{
nc=nl*nc;
nl=1;
}
for(int j=0;j<nl;j++)
{
uchar*data= image.ptr<uchar>(j);
for(int i=0;i<nc;i++) {
data[i]= (data[i]&mask) + div/2;
}
}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值