图像求像素均值的方法比较简单,将像素值累加后除于像素大小即可,相关代码如下所示:
long sum =0;
for(int hnum=0;hnum<height;hnum++)
{
for(int wnum=0;wnum<width;wnum++)
{
int pixel_point=hnum*l_width+wnum*3;
sum=sum+pColorData[pixel_point]+pColorData[pixel_point+1]+pColorData[pixel_point+2];
}
}
std::cout<<sum/(height*width*3)<<std::endl;
memset(pColorDataMid,sum/(height*width),height*l_width);
减法求前景的意思就是将原图像减去均值图像后可以得到原图像的前景,是一种常用的图像处理。效果如下:
代码如下:
"bmp.h"的头文件代码:bmp图片的类以及读写函数 bmp.h
c++代码:
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <malloc.h>
#include <cstdio>
#include "bmp.h"
using namespace std;
#define DRAW_HEIGHT 256 //目标图像高度
#define DRAW_WIDTH 256 //目标图像宽度
int main()
{
BMP rbmp;
BMP wbmp(DRAW_WIDTH,DRAW_HEIGHT);
char strFile[50] = "./lena24.bmp";//打开图像路径,BMP图像必须为24位真彩色格式
char strFilesave[50] = "./test.bmp";//处理后图像存储路径
//读取位图的数据
imread(strFile,rbmp);
int width = rbmp.cols();
int height = rbmp.rows();
int l_width = WIDTHBYTES(width*24);//计算位图的实际宽度并确保它为4byte的倍数
/*******************图像处理部分******************/
long sum =0;
for(int hnum=0;hnum<height;hnum++)
{
for(int wnum=0;wnum<width;wnum++)
{
int pixel_point=hnum*l_width+wnum*3;
sum=sum+pColorData[pixel_point]+pColorData[pixel_point+1]+pColorData[pixel_point+2];
}
}
int aver = sum/(height*width*3);
for(int hnum=0;hnum<height;hnum++)
{
for(int wnum=0;wnum<width;wnum++)
{
int pixel_point=hnum*l_width+wnum*3;
wbmp.pColorData[pixel_point]=rbmp.pColorData[pixel_point]-aver;
wbmp.pColorData[pixel_point+1]=rbmp.pColorData[pixel_point+1]-aver;
wbmp.pColorData[pixel_point+2]=rbmp.pColorData[pixel_point+2]-aver;
}
}
/*******************图像处理部分******************/
std::cout<<"Done!"<<std::endl;
imwrite(strFilesave,wbmp);
system("pause");
return 0;
}