图像归一化,减均值预处理

// normlizer.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <iostream>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>


using namespace std;
using namespace cv;
// Example 3 - 9. Summing all of the elements in a three - channel matrix
/*
float sum(const CvMat* mat) {


float s = 0.0f;
float* ptr = (float*)cvPtr2D(mat, 0, 0); //获取该三通道CvMat的首地址(这一句未经测试),将三通道看成是二通道


for (int row = 0; row<mat->rows; row++) {
for (int col = 0; col<mat->cols; col++) {
s += *ptr + *(ptr + 1) + *(ptr + 2);//将整个CvMat看成一个二维矩阵,则矩阵中每个元素是个三维向量,将它们累加
ptr += 3;//通道为3,则自加3可到达CvMat矩阵中的下个元素
}
}
return(s);
}
*/
// 下边是改正之后的
// Example 3 - 9. Summing all of the elements in a three - channel matrix
/*
float sum(const CvMat* mat) {


float s = 0.0f;
// float* ptr = (float*)cvPtr2D(mat, 0, 0); //获取该三通道CvMat的首地址(这一句未经测试),将三通道看成是二通道


for (int row = 0; row<mat->rows; row++) {
const float* ptr = (const float*)(mat->data.ptr + row * mat->step);//获取第row行的首地址
for (int col = 0; col<mat->cols; col++) {
s += *ptr + *(ptr + 1) + *(ptr + 2);//将整个CvMat看成一个二维矩阵,则矩阵中每个元素是个三维向量,将它们累加
ptr += 3;//通道为3,则自加3可到达CvMat矩阵中的下个元素
}
}
return(s);
}
*/
float GetImageAvePixel(const Mat image)
{
float SumPixels = 0.0f;
for (int i = 0; i<image.rows; i++)
for (int j = 0; j<image.cols; j++)
for (int n = 0; n < image.channels(); n++)
SumPixels = SumPixels + image.at<uchar>(i, j*image.channels() + n);   //取得像素
int NumPixels;
int AvePixel;
NumPixels = image.rows*image.cols*image.channels();
AvePixel = SumPixels / NumPixels;
return AvePixel;
}
// 减去均值
Mat SubtractImageAvePixel(const Mat image, int AvePixel)
{
Mat SubtractMat;
SubtractMat = image.clone();
float SumPixels = 0.0f;
for (int i = 0; i<image.rows; i++)
for (int j = 0; j<image.cols; j++)
for (int n = 0; n < image.channels(); n++)
SubtractMat.at<uchar>(i, j*SubtractMat.channels() + n) = image.at<uchar>(i, j*image.channels() + n) - AvePixel;   //取得像素
return SubtractMat;
}


int _tmain(int argc, _TCHAR* argv[])
{
Mat image = imread("D:\\test1.jpg");
if (image.empty())
{
cout << "fail to load image" << endl;
}
double ImageWidth, ImageHigh;
ImageHigh = image.rows;
ImageWidth = image.cols;
cout << "image size: " << image.size().height << "," << image.size().width << endl; //size()返回的是一个结构体  
cout << "ImageHigh ImageWidth: " << ImageHigh << "," << ImageWidth << endl; 
namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
imshow("image", image);
Mat image2;
// 1直接缩放到固定的大小
// resize(image, image2, Size(32, 32), 0, 0, CV_INTER_LINEAR);
resize(image, image2, Size(32, 32), 0, 0, CV_INTER_LINEAR);
// Size dsize = new Size(640, 480);
//缩放
//Size dsize = Size(image.cols*scale, image.rows*scale);
//Mat image2 = Mat(dsize, CV_32S);
//resize(image, image2, dsize);


// double scale = (ImageHigh - 27) / ImageHigh;// 控制缩放比例
double scale = 27 / ImageHigh;// 控制缩放比例
Size dsize = Size(image.cols*scale, image.rows*scale);
resize(image, image2, dsize);
cout << "image size: " << image2.size().height << "," << image2.size().width << endl; //size()返回的是一个结构体 
// CvMat cvimage2Mat = image2; // Mat -> CvMat
float SumPixl = GetImageAvePixel(image2);
cout << " SumPixl: " << SumPixl << endl; //size()返回的是一个结构体 
namedWindow("image2", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
imshow("image2", image2);
// 获取减去均值的图像
Mat SubtractImageAve = SubtractImageAvePixel(image, SumPixl);
namedWindow("SubtractImageAve", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
imshow("SubtractImageAve", SubtractImageAve);
waitKey(0);


return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值