图像卷积不根据实际算法工作
Image Convolution not working according to the actual algorithm
我在 java 中实现了一个卷积过滤器。我在 ap cs 中做过一段时间,但现在我确实需要它来做某事,所以我重新实现了它以确保我仍然知道如何去做。不幸的是,我丢失了我的工作副本,所以我无法将当前代码与我以前的工作代码进行比较。我很确定我正确地实现了算法,但代码仍然无法正常工作。有经验的程序员能解释一下我做错了什么吗?
这是卷积 class:
import java.awt.*;
import java.util.Arrays;
public class ConvolutionFilter {
private int[][] image;
private int[][] weights;
private double[][] doubleWeights;
private int[][] convolved;
public ConvolutionFilter(int[][] image, int[][] weights) {
this.image = image;
this.weights = weights;
convolve();
}
public void convolve() {
int sum;
int[][] convolved = new int[image.length][image[0].length];
for (int r = 0; r < convolved.length - weights.length - 1; r++) {
for (int c = 0; c < convolved[r].length - weights.length - 1; c++) {
sum = 0;
for (int i = 0; i < weights.length; i++) {
for (int j = 0; j < weights[i].length; j++) {
sum += image[r + i][c + j] * weights[i][j];
}
}
convolved[r][c] = sum / weight();
}
}
this.convolved = convolved;
}
public int numWeights() {
return weights.length * weights[0].length;
}
public int weight() {
int sum = 0;
for (int r = 0; r < weights.length; r++) {
for (int c = 0; c < weights[r].length; c++) {
sum += weights[r][c];
}
}
if (sum == 0) return 1; else return sum;
}
public int[][] getConvolved() {
return convolved;
}
}
感谢任何帮助!
为了使其适用于 RGB,算法应该针对每个通道而不是打包表示进行,例如(未测试)
public void convolve() {
int[][] convolved = new int[image.length][image[0].length];
double invScale = 1.0 / weight();
for (int r = 0; r < convolved.length - weights.length - 1; r++) {
for (int c = 0; c < convolved[r].length - weights.length - 1; c++) {
int rsum = 0, gsum = 0, bsum = 0;
for (int i = 0; i < weights.length; i++) {
for (int j = 0; j < weights[i].length; j++) {
int pixel = image[r + i][c + j];
int w = weights[i][j];
rsum += ((pixel >> 16) & 0xFF) * w;
gsum += ((pixel >> 8) & 0xFF) * w;
bsum += (pixel & 0xFF) * w;
}
}
rsum = (int)(rsum * invScale);
gsum = (int)(gsum * invScale);
bsum = (int)(bsum * invScale);
convolved[r][c] = bsum | (gsum << 8) | (rsum << 16) | (0xFF << 24);
}
}
this.convolved = convolved;
}
我在 java 中实现了一个卷积过滤器。我在 ap cs 中做过一段时间,但现在我确实需要它来做某事,所以我重新实现了它以确保我仍然知道如何去做。不幸的是,我丢失了我的工作副本,所以我无法将当前代码与我以前的工作代码进行比较。我很确定我正确地实现了算法,但代码仍然无法正常工作。有经验的程序员能解释一下我做错了什么吗?
这是卷积 class:
import java.awt.*;
import java.util.Arrays;
public class ConvolutionFilter {
private int[][] image;
private int[][] weights;
private double[][] doubleWeights;
private int[][] convolved;
public ConvolutionFilter(int[][] image, int[][] weights) {
this.image = image;
this.weights = weights;
convolve();
}
public void convolve() {
int sum;
int[][] convolved = new int[image.length][image[0].length];
for (int r = 0; r < convolved.length - weights.length - 1; r++) {
for (int c = 0; c < convolved[r].length - weights.length - 1; c++) {
sum = 0;
for (int i = 0; i < weights.length; i++) {
for (int j = 0; j < weights[i].length; j++) {
sum += image[r + i][c + j] * weights[i][j];
}
}
convolved[r][c] = sum / weight();
}
}
this.convolved = convolved;
}
public int numWeights() {
return weights.length * weights[0].length;
}
public int weight() {
int sum = 0;
for (int r = 0; r < weights.length; r++) {
for (int c = 0; c < weights[r].length; c++) {
sum += weights[r][c];
}
}
if (sum == 0) return 1; else return sum;
}
public int[][] getConvolved() {
return convolved;
}
}
感谢任何帮助!
为了使其适用于 RGB,算法应该针对每个通道而不是打包表示进行,例如(未测试)
public void convolve() {
int[][] convolved = new int[image.length][image[0].length];
double invScale = 1.0 / weight();
for (int r = 0; r < convolved.length - weights.length - 1; r++) {
for (int c = 0; c < convolved[r].length - weights.length - 1; c++) {
int rsum = 0, gsum = 0, bsum = 0;
for (int i = 0; i < weights.length; i++) {
for (int j = 0; j < weights[i].length; j++) {
int pixel = image[r + i][c + j];
int w = weights[i][j];
rsum += ((pixel >> 16) & 0xFF) * w;
gsum += ((pixel >> 8) & 0xFF) * w;
bsum += (pixel & 0xFF) * w;
}
}
rsum = (int)(rsum * invScale);
gsum = (int)(gsum * invScale);
bsum = (int)(bsum * invScale);
convolved[r][c] = bsum | (gsum << 8) | (rsum << 16) | (0xFF << 24);
}
}
this.convolved = convolved;
}