数字图像处理 || c++对图像进行对数变换,幂律变换,比特面分层以及均衡化处理

17 篇文章 2 订阅
7 篇文章 0 订阅

对数变换:

CImg<int> SrcImg;
SrcImg.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0305(a)(DFT_no_log).tif");
SrcImg.display();
cimg_forXY(SrcImg, x, y) {
	SrcImg(x, y) = int(log(double(SrcImg(x, y)) + 1));
}
SrcImg.display();

运行效果:
在这里插入图片描述

在这里插入图片描述

幂律变换

CImg<int> SrcImg;
SrcImg.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0308(a)(fractured_spine).tif");
SrcImg.display();
double t[3] = { 0.6,0.4,0.3 };
for (int i = 0; i < 3; i++) {
	CImg<int> img = SrcImg;
	cimg_forXY(img, x, y) {
		img(x, y) = int(pow(double((img(x, y))), t[i]));
	}
	img.display();
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

比特面分层

CImg<int> img;
	img.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0314(a)(100-dollars).tif");
	img.display("原图");
	int w = img.height();
	int h = img.width();
	CImg<int> p1(h,w,1,1), p2(h, w, 1, 1), p3(h, w, 1, 1), p4(h, w, 1, 1), p5(h, w, 1, 1), p6(h, w, 1, 1), p7(h, w, 1, 1), p8(h, w, 1, 1);
	cimg_forXY(img, x, y) {
		int num = img(x, y);
		int *bit = binary(num);
		p1(x, y) = fx(bit[0]); p2(x, y) = fx(bit[1]); p3(x, y) = fx(bit[2]); p4(x, y) = fx(bit[3]);
		p5(x, y) = fx(bit[4]); p6(x, y) = fx(bit[5]); p7(x, y) = fx(bit[6]); p8(x, y) = fx(bit[7]);
	}
	p8.display("第八层比特图");
	p7.display("第七层比特图");
	p6.display("第六层比特图");
	p5.display("第五层比特图");
	p4.display("第四层比特图");
	p3.display("第三层比特图");
	p2.display("第二层比特图");
	p1.display("第一层比特图");
}
//用于对图片进行黑白的赋值
int fx(int n) {
	if (n == 1)
		return 255;
	else
		return 0;
}
//用于进行二进制转化的函数
int* binary(int num) {
	int *bit;
	bit = new int[8];
	for (int i = 0; i < 8; i++) {
		bit[i] = 0;
	}
	int i = 0;
	while (num) {
		bit[i] = num % 2;
		num /= 2;
		i++;
	}
	return bit;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

均衡化处理

  • CImg有专门显示密度分布直方图的histogram函数
	CImg<int> hist = img.histogram(256, 0, 255); //histogram的第一个参数是共有256个灰度级,第二个参数是灰度的最小值,第三个是灰度最大值
	hist.display_graph();
	CImg<int> img;
	img.load_tiff("E:/Desktop/picture_process/Lenna/3/Fig0316(4)(bottom_left).tif");
	CImg<int> pic = img;
	img.display("处理前图片");
	int size = img.size();
	CImg<int> hist = img.histogram(256, 0, 255); //histogram的第一个参数是共有256个灰度级,第二个参数是灰度的最小值,第三个是灰度最大值
	hist.display_graph("处理前直方图");
	double sum = 0.0;
	map<int, int> index;
	for (int i = 0; i < 256; i++) {
		sum += (double) hist(i)/size;
		int Sum = (int)(sum * 255);
		index.insert(pair<int, int>(i, Sum));
	}
	//map<int, int>::iterator iter = index.begin();
	//map<int, int>::iterator end = index.end();
	/*for (; iter != end; iter++) {
		cout << iter->first<<":"<< iter->second << endl;
	}*/
	cimg_forXY(pic, x, y) {
		pic(x, y) = index[pic(x, y)];
		//cout << pic(x, y) << " ";
	}
	pic.display("处理后图片");
	CImg<int> hist1 = pic.histogram(256, 0, 255);
	hist1.display_graph("处理后直方图");

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数字图像处理中的傅里叶变换是将一个图像从空间域转换到频域的方法,可以用来分析图像的频率特征,如高频和低频成分等。傅里叶变换图像处理中有着广泛的应用,例如在图像滤波、图像增强、图像压缩等方都有着重要的作用。离散傅里叶变换是一种将有限长的离散序列转换到频域的方法,与连续傅里叶变换类似,它也将时域信号分解成不同频率的正弦和余弦信号。 在C++中,可以通过调用FFTW(Fastest Fourier Transform in the West)库中的函数来实现离散傅里叶变换。FFTW库是一种高效的、免费的、开源的FFT实现库,在多个平台上都可以使用。要使用FFTW库,需要先下载相应的头文件和库文件,并将其添加到C++项目中。下是一个简单的使用FFTW库计算离散傅里叶变换的例子: ``` #include <fftw3.h> #include <iostream> #include <cmath> using namespace std; int main() { int N = 8; //序列长度 double x[N] = {1, 2, 3, 4, 5, 6, 7, 8}; //输入序列 fftw_complex *X = new fftw_complex[N/2+1]; //输出序列 fftw_plan plan = fftw_plan_dft_r2c_1d(N, x, X, FFTW_ESTIMATE); //创建FFT计算计划 fftw_execute(plan); //执行FFT计算 for (int i = 0; i < N/2+1; i++) { double freq = (double)i / N; //计算频率 double mag = sqrt(X[i]*X[i] + X[i]*X[i]); //计算幅值 cout << "Frequency " << freq << ": Magnitude " << mag << endl; //输出频率和幅值 } fftw_destroy_plan(plan); //销毁FFT计算计划 delete[] X; //释放内存 return 0; } ``` 这个例子中使用了fftw_plan_dft_r2c_1d函数创建了一个计算离散傅里叶变换的计划,并使用fftw_execute函数执行了该计划。计算得到的结果存储在X数组中,然后可以根据需要对结果进行进一步处理

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值