
opencv使用指针遍历图像中,颜色缩减函数里的问题
voidcolorreduce(Mat&img,intdiv=64){intnl=img.rows;intnc=img.cols*img.channels();for(i...
void colorreduce(Mat& img, int div = 64)
{
int nl = img.rows;
int nc = img.cols * img.channels();
for(int j = 0; j < nl; j ++)
{
uchar* data = img.ptr<uchar>(j);
for(int i = 0; i < nc; i ++)
{
data[i] = data[i] / div * div + div / 2;
}
}
}
代码最后一行为什么要加div/2,这有什么用啊?我怎么感觉两个输出一样啊
源图像输出:
加div/2
不加div / 2 展开
{
int nl = img.rows;
int nc = img.cols * img.channels();
for(int j = 0; j < nl; j ++)
{
uchar* data = img.ptr<uchar>(j);
for(int i = 0; i < nc; i ++)
{
data[i] = data[i] / div * div + div / 2;
}
}
}
代码最后一行为什么要加div/2,这有什么用啊?我怎么感觉两个输出一样啊
源图像输出:
加div/2
不加div / 2 展开
展开全部
颜色空间压缩。
例如:
1,如果data[i] = 0 ;
data[i] = data[i] / div * div + div / 2 = 0 / 64 * 64 + 32 = 32
2,如果data[i] = 255 ;
data[i] = data[i] / div * div + div / 2 = 255 / 64 * 64 + 32 = 3*64 + 32 = 224
所以0-255 变为了 32-224,颜色被压缩了。
肉眼看不出差别不代表没有差别。你对程序进行调试,或者两幅图像做差,可以看出每个像素点颜色都是不一样的。
例如:
1,如果data[i] = 0 ;
data[i] = data[i] / div * div + div / 2 = 0 / 64 * 64 + 32 = 32
2,如果data[i] = 255 ;
data[i] = data[i] / div * div + div / 2 = 255 / 64 * 64 + 32 = 3*64 + 32 = 224
所以0-255 变为了 32-224,颜色被压缩了。
肉眼看不出差别不代表没有差别。你对程序进行调试,或者两幅图像做差,可以看出每个像素点颜色都是不一样的。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询