- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在图像上实现二维傅里叶变换。我有了它,所以我的 DFT 和逆 DFT 可以在图像上工作。但是当我应用滤波器时,通过将复数相乘,并对结果求逆,我只会得到图像噪声。
这是我的 2d DFT
public void dft(double[][] inreal, double[][] inimag) {
int n = inreal.length;
double[][] tempreal = new double[n][n];
double[][] tempimag = new double[n][n];
realArray = new double[n][n];
imagArray = new double[n][n];
for(int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
double sumreal = 0;
double sumimag = 0;
for (int t = 0; t < n; t++) {
double angle = 2 * Math.PI * t * col / n;
sumreal += inreal[row][t] * Math.cos(angle) + inimag[row][t] * Math.sin(angle);
sumimag += -inreal[row][t] * Math.sin(angle) + inimag[row][t] * Math.cos(angle);
}
//System.out.println("r" + row + " " + "c" + col + " " + sumreal + " " + sumimag);
tempreal[row][col] = sumreal;
tempimag[row][col] = sumimag;
}
}
//now do it over the columns
for (int col = 0; col < n; col++) {
for (int row = 0; row < n; row++) { // For each output element
double sumreal = 0;
double sumimag = 0;
for (int t = 0; t < n; t++) { // For each input element
double angle = 2 * Math.PI * t * row / n;
sumreal += tempreal[t][col] * Math.cos(angle) + tempimag[t][col] * Math.sin(angle);
sumimag += -tempreal[t][col] * Math.sin(angle) + tempimag[t][col] * Math.cos(angle);
}
realArray[row][col] = sumreal;
imagArray[row][col] = sumimag;
//System.out.println(realArray[row][col] + " " + imagArray[row][col] + "i");
}
}
}
这是我的逆 DFT
public void inverseDFT(double[][] inRealArray, double[][] inImagArray) {
int n = realArray.length;
outRealArray = new double[n][n];
outImagArray = new double[n][n];
outputarray = new int[n][n];
double[][] tempreal = new double[n][n];
double[][] tempimag = new double[n][n];
for (int col = 0; col < n; col++) {
for (int row = 0; row < n; row++) { // For each output element
double sumreal = 0;
double sumimag = 0;
for (int t = 0; t < n; t++) { // For each input element
double angle = 2 * Math.PI * t * row / n;
sumreal += inRealArray[t][col] * Math.cos(angle) - inImagArray[t][col] * Math.sin(angle);
sumimag += inRealArray[t][col] * Math.sin(angle) + inImagArray[t][col] * Math.cos(angle);
}
//System.out.println("r" + row + " " + "c" + col + " " + sumreal + " " + sumimag);
tempreal[row][col] = sumreal;
tempimag[row][col] = sumimag;
}
}
//now do it over the columns
for(int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) { // For each output element
double sumreal = 0;
double sumimag = 0;
for (int t = 0; t < n; t++) { // For each input element
double angle = 2 * Math.PI * t * col / n;
sumreal += tempreal[row][t] * Math.cos(angle) - tempimag[row][t] * Math.sin(angle);
sumimag += tempreal[row][t] * Math.sin(angle) + tempimag[row][t] * Math.cos(angle);
}
outRealArray[row][col] = sumreal / (n * n);
outImagArray[row][col] = sumimag / (n * n);
outputarray[row][col] = (int)Math.abs(outRealArray[row][col]);
//System.out.println(outRealArray[row][col] + " " + outImagArray[row][col] + "i");
}
}
}
图像经过并返回相同。我将图像移动到中心并获取光谱图像来测试它是否有效。
这是复数的大小并移至中心
低通滤波器
过滤器通过 DFT。
这是我将两者相乘的代码。
public void applyLowPassFilter(String filename, double[][] realArray, double[][] imagArray) throws IOException {
ReadPGMFile readPGM = new ReadPGMFile(filename);
double[][] filterArrayR = readPGM.loadArray();
double[][] filterArrayI = new double[filterArrayR.length][filterArrayR.length];
FourierTransform ft = new FourierTransform();
ft.dft(filterArrayR, filterArrayI);
filterReal = ft.getRealArray();
filterImag = ft.getImagArray();
int n = realArray.length;
resultRealArray = new double[n][n];
resultImagArray = new double[n][n];
for(int i = 0; i < n; i++){
int colValue = 0;
int rowValue = 0;
for(int j = 0; j < n; j++) {
if(j < n / 2 ){
colValue = (n / 2) - j;
} else {
colValue = (n - 1) - (j - ((n - 1) / 2));
}
if (i < n / 2) {
rowValue = (n / 2) - i;
} else {
rowValue = (n - 1) - (i - ((n - 1) / 2));
}
resultRealArray[i][j] = realArray[rowValue][colValue] * filterReal[i][j] - imagArray[rowValue][colValue] * filterImag[i][j];
resultImagArray[i][j] = realArray[rowValue][colValue] * filterImag[i][j] + imagArray[rowValue][colValue] * filterReal[i][j];
}
}
}
这就是我得到的结果。抱歉发了这么长的帖子。如果有人有任何见解,我将不胜感激。我已经为此苦苦挣扎了几个星期。
最佳答案
这是我用来测试它的代码:
int[] pix=bim.getRGB(0, 0, wc, hc, null, 0, wc);
double[][] ri=new double[hc][hc], ii=new double[hc][hc], ro=new double[hc][hc], io=new double[hc][hc];
for(i=0; i<hc; i++)
for(j=0; j<hc; j++) {
int rr=(pix[i+j*wc]&0x00ff0000)>>16, rg=(pix[i+j*wc]&0x0000ff00)>>8, rb=pix[i+j*wc]&0x000000ff;
ri[i][j]=0.2126*rr+0.7152*rg+0.0722*rb;
}
double[][] ff=new double[hc][hc];
ff[hc/2][hc/2]=ff[hc/2][hc/2+1]=ff[hc/2][hc/2-1]=ff[hc/2+1][hc/2]=ff[hc/2-1][hc/2]=1;
// ff[hc/2][hc/2]=ff[hc/2][hc/2+1]=ff[hc/2][hc/2-1]=ff[hc/2+1][hc/2]=ff[hc/2-1][hc/2]=ff[hc/2-1][hc/2-1]=ff[hc/2-1][hc/2+1]=ff[hc/2+1][hc/2-1]=ff[hc/2+1][hc/2+1]=0.125;
filterDFT(ff, ri, ro, io);
int[] pix2=new int[hc*hc];
for(i=0; i<hc; i++)
for(j=0; j<hc; j++) pix2[i+j*hc]=0xff000000|(int)Math.abs(ro[i][j]);
BufferedImage b2=new BufferedImage(hc, hc, BufferedImage.TYPE_INT_RGB);
b2.setRGB(0, 0, hc, hc, pix2, 0, hc);
现在 b2 就是你的图像;它显示得很好 - 你必须重新洗牌象限。
因此,我建议您再次查看您的过滤器读取的下载内容。
关于java - 如何使用离散傅里叶变换在频域中的图像上实现低通滤波器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36878830/
如何在 Flutter 中使 slider 离散看起来像上图? slider discrete 最佳答案 使用 divisions Slider 的属性(property)小部件将其分成相等的部分,然
我正在创建一个带有颜色条的散点图 plt.scatter(X, Y, c=Z) plt.colorbar() plt.show() plt.close() 其中 X 和 Y 是 float 组,Z 是
我刚刚在 android studio 中发现了 seekbar 离散小部件,我发现它非常有用,但我不知道如何删除步骤指示器,或者用更合适的可绘制对象更改它们。 有人设法做到了吗? 这是我当前搜索栏的
问题 请注意以下问题:巫师可以创建和销毁 rune 。创建一个新的 rune 需要消耗与先前创建的 rune 数量成比例的法力。摧毁 rune 会恢复创建 rune 所用的法力。下面,我提出一个可能的
我正在尝试使用 ggplot2 中的 sf 和 geom_sf 制作 map ,其中一组点数据使用连续颜色比例(-1 到 1),一组线数据使用离散比例(a、b、c、d)着色。但是,当我在同一张 map
我正在尝试在具有连续状态(dim.= 20)和离散操作(3 个可能的操作)的环境中找到最佳策略。并且有一个特定的时刻:对于最佳策略,一个操作(称为“操作 0”)的选择频率应比其他两个操作高得多(频率约
仅使用 x-y 位置移动绘制圆弧的最佳方法是什么?例如,假设我想在点 (4,4) 处绘制一个半径为 4 的圆。让我们看看我的“抽屉”从 (4,0) 开始,每个方向的分辨率为 0.1 步。我将如何创建一
我正在使用一个使用广义加法模型的随机站点级效应来拟合一个模型,该模型在 mgcv 中实现。 R 包。我一直在使用函数 gam() 执行此操作但是,为了加快速度,我需要转到 bam()框架,与gam()
这个问题在这里已经有了答案: Make a line separated by group in bar chart (3 个答案) 关闭上个月。 我正在尝试使用 ggplot2 在条形图的每个条上
这个问题在这里已经有了答案: Make a line separated by group in bar chart (3 个答案) 关闭上个月。 我正在尝试使用 ggplot2 在条形图的每个条上
是否可以同时使用 Intel HD 4000 集成显卡和独立 GPU,OpenCL(或 CUDA)作为设备,CPU 作为主机?我想要一些代码在集成显卡上运行,而其他代码同时在我的 GPU 上运行。 最
我是一名优秀的程序员,十分优秀!