//给图像添加高斯噪声,生成随机文件名保存到新的文件夹中,并可用高斯滤波、算术均值滤波、几何均值滤波、谐波均值滤波、逆谐波均值滤波去噪
#include "stdafx.h"
using namespace cv;
using namespace std;
#define MAX_PATH 1024 //最长路径长度
#define GUID_LEN 64
IplImage* AddGuassianNoise(IplImage* src);
//IplImage* GeometryMeanFilter(IplImage* src);
//IplImage* HarmonicMeanFilter(IplImage* src);
//IplImage* InverseHarmonicMeanFilter(IplImage* src);
IplImage* ArithmeticMeanFilter(IplImage* src);
IplImage* GaussianFilter(IplImage* src);
IplImage *Mat_To_IplImage(Mat Transformation_Image);
IplImage* addNoiseDeNoise(Mat srcImage);
void find(char* lpPath,std::vector<const std::string> &fileList);
string uuidCreate(void);
//stringstream create(int m);
//加噪函数
IplImage* addNoiseDeNoise(Mat srcImage)
{
if (!srcImage.data)
{
cout << "读入图片错误!" << endl;
system("pause");
}
IplImage* dst1 = Mat_To_IplImage(srcImage);//Mat转IplImage
IplImage* dst2 = AddGuassianNoise(dst1);//加噪
IplImage* dst=dst2;
//IplImage* dst3 = GaussianFilter(dst2);//去噪
//IplImage* dst=dst3;
return dst;
}
//Mat类型转IplImage类型
IplImage* Mat_To_IplImage(Mat Transformation_Image)
{
IplImage imgImage1=Transformation_Image;
IplImage *Transformation_Image_Ipl=cvCloneImage(&imgImage1);
return Transformation_Image_Ipl;
}
//算术均值滤波器——模板大小5*5/3*3/2*2(效果不错,尤其是2*2)
IplImage* ArithmeticMeanFilter(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
cvSmooth(src,dst,CV_BLUR,2);
return dst;
}
//高斯滤波器——模板大小5*5/3*3(效果不错,尤其是3*3)
IplImage* GaussianFilter(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
cvSmooth(src,dst,CV_GAUSSIAN,5,5);
return dst;
}
/*----------------------------
* 功能 : 递归遍历文件夹,找到其中包含的所有文件
*----------------------------
* 函数 : find
* 访问 : public
*
* 参数 : lpPath [in] 需遍历的文件夹目录
* 参数 : fileList [in] 以文件名称的形式存储遍历后的文件
*/
void find(char* lpPath,std::vector<const std::string> &fileList)
{
char szFind[MAX_PATH];
WIN32_FIND_DATA FindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"\\*.*");
HANDLE hFind=::FindFirstFile(szFind,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind) return;
while(true)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!='.')
{
char szFile[MAX_PATH];
strcpy(szFile,lpPath);
strcat(szFile,"\\");
strcat(szFile,(char* )(FindFileData.cFileName));
find(szFile,fileList);
}
}
else
{
//std::cout << FindFileData.cFileName << std::endl;
fileList.push_back(FindFileData.cFileName);
}
if(!FindNextFile(hFind,&FindFileData)) break;
}
FindClose(hFind);
}
////把int类型转成stringstream类型
//stringstream create(int m)
//{
// stringstream ss;
// ss<<m;
// return ss;
//}
//生成随机文件名
string uuidCreate(void)
{
char buffer[GUID_LEN] = { 0 };
GUID guid;
if (CoCreateGuid(&guid))
{
fprintf(stderr, "create guid error\n");
return "";
}
_snprintf(buffer, sizeof(buffer),
"%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X",
guid.Data1, guid.Data2, guid.Data3,
guid.Data4[0], guid.Data4[1], guid.Data4[2],
guid.Data4[3], guid.Data4[4], guid.Data4[5],
guid.Data4[6], guid.Data4[7]);
return buffer;
}
//添加高斯噪声
IplImage* AddGuassianNoise(IplImage* src)
{
IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
IplImage* noise = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
CvRNG rng = cvRNG(-1);
cvRandArr(&rng,noise,CV_RAND_NORMAL,cvScalarAll(0),cvScalarAll(20));//参数可改
cvAdd(src,noise,dst);
return dst;
}
int main()
{
Mat dst2;
std::vector<const std::string> fileList;//定义一个存放结果文件名称的链表
//遍历一次结果的所有文件,获取文件名列表
find("D:\\caffe-master\\data\\recognition\\加噪处理\\9",fileList);//之后可对文件列表中的文件进行相应的操作
//输出文件夹下所有文件的名称
for(int i = 0; i < fileList.size(); i++)
{
////IplImage* dst = cvLoadImage("E:\\加噪处理\\0\\"+fileList[i]);//为什么cvLoadImage不行?
Mat img = imread("D:\\caffe-master\\data\\recognition\\加噪处理\\9\\"+fileList[i],0);//cvtColor(dst1,dst2,CV_BGR2GRAY);
IplImage* dst = addNoiseDeNoise(img);
Mat dst1(dst);//IplImage*转Mat
imwrite("D:\\caffe-master\\data\\recognition\\加噪处理\\10\\"+uuidCreate()+".jpg", dst1);
}
cout << "文件数目:" << fileList.size() << endl;
system("pause");
return 0;
}
////几何均值滤波器(变蓝,效果不好)
//IplImage* GeometryMeanFilter(IplImage* src)
//{
// IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
// int row, col;
// int h=src->height;
// int w=src->width;
// double mul[3];
// double dc[3];
// int mn;
// //计算每个像素的去噪后color值
// for(int i=0;i<src->height;i++){
// for(int j=0;j<src->width;j++){
// mul[0]=1.0;
// mn=0;
// //统计邻域内的几何平均值,邻域大小5*5
// for(int m=-2;m<=2;m++){
// row = i+m;
// for(int n=-2;n<=2;n++){
// col = j+n;
// if(row>=0&&row<h && col>=0 && col<w){
// CvScalar s = cvGet2D(src, row, col);
// mul[0] = mul[0]*(s.val[0]==0?1:s.val[0]); //邻域内的非零像素点相乘
// mn++;
// }
// }
// }
// //计算1/mn次方
// CvScalar d;
// dc[0] = pow(mul[0], 1.0/mn);
// d.val[0]=dc[0];
// //统计成功赋给去噪后图像。
// cvSet2D(dst, i, j, d);
// }
// }
// return dst;
//}
//
////谐波均值滤波器——模板大小5*5(变蓝,效果不好)
//IplImage* HarmonicMeanFilter(IplImage* src)
//{
// IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
// int row, col;
// int h=src->height;
// int w=src->width;
// double sum[3];
// double dc[3];
// int mn;
// //计算每个像素的去噪后color值
// for(int i=0;i<src->height;i++){
// for(int j=0;j<src->width;j++){
// sum[0]=0.0;
// mn=0;
// //统计邻域,5*5模板
// for(int m=-2;m<=2;m++){
// row = i+m;
// for(int n=-2;n<=2;n++){
// col = j+n;
// if(row>=0 && row<h && col>=0 && col<w){
// CvScalar s = cvGet2D(src, row, col);
// sum[0] = sum[0]+(s.val[0]==0?255:255/s.val[0]);
// mn++;
// }
// }
// }
// CvScalar d;
// dc[0] = mn*255/sum[0];
// d.val[0]=dc[0];
// //统计成功赋给去噪后图像。
// cvSet2D(dst, i, j, d);
// }
// }
// return dst;
//}
//
////逆谐波均值大小滤波器——模板大小5*5(变蓝,效果不好)
//IplImage* InverseHarmonicMeanFilter(IplImage* src)
//{
// IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
// //cvSmooth(src,dst,CV_BLUR,5);
// int row, col;
// int h=src->height;
// int w=src->width;
// double sum[3];
// double sum1[3];
// double dc[3];
// double Q=2;
// //计算每个像素的去噪后color值
// for(int i=0;i<src->height;i++){
// for(int j=0;j<src->width;j++){
// sum[0]=0.0;
// sum1[0]=0.0;
// //统计邻域
// for(int m=-2;m<=2;m++){
// row = i+m;
// for(i