Java 图像内核筛选器未生成正确的结果
我写了一些代码来改变我的图像内核过滤器的尺寸。您可以选择3x3、5x5或7x7矩阵。问题是,当我切换到5x5或7x7时,只有前3行和前3列中的单元格工作。所以它们就像一个3x3矩阵。当我尝试使用5x5或7x7应用单位矩阵时,我知道它不起作用的一个例子是,在这里,除了中心单元格外,到处都是零,中心单元格将有一个1。对我来说,这会产生一个黑色的图像 下面是应用映像内核的代码Java 图像内核筛选器未生成正确的结果,java,imagefilter,Java,Imagefilter,我写了一些代码来改变我的图像内核过滤器的尺寸。您可以选择3x3、5x5或7x7矩阵。问题是,当我切换到5x5或7x7时,只有前3行和前3列中的单元格工作。所以它们就像一个3x3矩阵。当我尝试使用5x5或7x7应用单位矩阵时,我知道它不起作用的一个例子是,在这里,除了中心单元格外,到处都是零,中心单元格将有一个1。对我来说,这会产生一个黑色的图像 下面是应用映像内核的代码 for (int y = 1; y < img.height-1; y++) { // Skip top and b
for (int y = 1; y < img.height-1; y++) { // Skip top and bottom edges
for (int x = 1; x < img.width-1; x++) { // Skip left and right edges
float sumR = 0; // Kernel sum for this pixel
float sumG = 0;
float sumB = 0;
for (int ky = -1; ky <= 1; ky++) {
for (int kx = -1; kx <= 1; kx++) {
// Calculate the adjacent pixel for this kernel point
int pos = (y + ky)*img.width + (x + kx);
float rVal = red(img.pixels[pos]);
float gVal = green(img.pixels[pos]);
float bVal = blue(img.pixels[pos]);
// Multiply adjacent pixels based on the kernel values
sumR += kernel[ky+1][kx+1] * rVal;
sumG += kernel[ky+1][kx+1] * gVal;
sumB += kernel[ky+1][kx+1] * bVal;
}
}
//For this pixel in the new image, set the rgb value
//based on the sum from the kernel
edgeImg.pixels[y*img.width + x] = color(sumR,sumG,sumB);
}
}
for(int y=1;y 对于(int ky=-1;ky如果我理解正确,您希望将此代码用于5x5和7x7内核
如果是这种情况,问题在于以下几行:
for (int ky = -1; ky <= 1; ky++) {
for (int kx = -1; kx <= 1; kx++) {
}
我还没有测试过这段代码,但是想法应该很清楚
// Calculate the distance from the center to the edge
int side_width = (kernel_size-1)/2
for (int y = side_width; y < img.height-side_width; y++) { // Skip top and bottom edges
for (int x = side_width; x < img.width-side_width; x++) { // Skip left and right edges
float sumR = 0; // Kernel sum for this pixel
float sumG = 0;
float sumB = 0;
for (int ky = 0; ky <= kernel_size - 1; ky++) {
for (int kx = 0; kx <= kernel_size - 1; kx++) {
// Calculate the adjacent pixel for this kernel point
int pos = (y - side_width + ky)*img.width + (x - side_width + kx);
float rVal = red(img.pixels[pos]);
float gVal = green(img.pixels[pos]);
float bVal = blue(img.pixels[pos]);
// Multiply adjacent pixels based on the kernel values
sumR += kernel[ky][kx] * rVal;
sumG += kernel[ky][kx] * gVal;
sumB += kernel[ky][kx] * bVal;
}
}
//For this pixel in the new image, set the rgb value
//based on the sum from the kernel
edgeImg.pixels[y*img.width + x] = color(sumR,sumG,sumB);
}