说明:
彩色图像像素形式为3通道像素,每个通道数据格式为
8-bit
unsigned char ,因此数据总量为
256x256x256 ,这些彩色数据对于计算机来讲处理将占用大量内存和CPU为此,希望通过降低彩色数的方式,降低至
256/Nx256/Nx256/N。数据形式是从图片左上角开始,在opencv中默认BGR 。有的计算机芯片处理数据为4的倍数,因此如果超出的部分将不会记录。假定图片色度范围为0-255,N选取为64则 色彩数降低为4X4X4;换算公式为 data=data/N*N+N/2;data/N获得
色度区间 0-64->0 64-128->1 128-192->2 128-256->3 ,再乘以N,为0 64 128 192, 再加N/2 ,4个色度变为 32 96 160 224,即彩色图的每个通道(,B,G,R)只有4种颜色,整幅图将只有4*4*4种颜色,对于灰度图将只有四种颜色,好像我弄错了
,每个通道表示的是灰度值,因此是只有4个亮度点

程序:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
void colorReduce(cv::Mat &image, int div=64)
{
int nl = image.rows;//number of lines
int nc = image.cols * image.channels();//total number of elements(pixel) per line
for (int j = 0; j < nl; j++)
{
uchar* data = image.ptr<uchar>(j);//get the address of row
for (int i = 0; i < nc; i++)
{
data[i] = data[i] / div*div + div / 2;
}
}
}
int main()
{
cv::Mat image = cv::imread("bfg.jpg",<span style="background-color: rgb(255, 0, 0);">CV_LOAD_IMAGE_UNCHANGED</span>);
colorReduce(image);
cv::namedWindow("Image");
cv::imshow("Image", image);
cv::waitKey(0);
}
彩色图运行结果
<span style="background-color: rgb(255, 0, 0);">CV_LOAD_IMAGE_UNCHANGED 改为</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">CV_LOAD_IMAGE_GRAYSCALE</span>
灰度运行结果