由于您可以访问 matlab,我建议您深入研究他们的代码,假设他们的图像内容是用 Matlab 编写的,我认为是这样,然后看看他们如何将 RGB 转换为强度。他们是否使用 HSL(色相-饱和度-亮度)?或其他一些颜色转换。知道了这一点,您就可以找到 Java 代码来将例如 RGB 转换为 HSL。
编辑:
根据这个问题的 cmets,我认为这段代码会起作用。它不完整,因为我没有复制和重写所有操作,但它应该给你的想法。
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class Convolution {
public static void main( String[] args ) throws Exception {
File inputFile = new File("apple.jpg");
BufferedImage bufferedImage = ImageIO.read(inputFile);
int w = bufferedImage.getWidth();
int h = bufferedImage.getHeight();
System.out.println("w=" + w + ", h=" + h);
// Get Pixels
int[] image = new int[w * h];
bufferedImage.getRGB(0, 0, w, h, image, 0, w);
// Convert to simple grayscale
for ( int y = 0; y < h; y++ ) {
for ( int x = 0; x < w; x++ ) {
int idx = ( y * w ) + x;
int p = image[idx];
int r = p & 0x00FF0000 >> 16;
int g = p & 0x0000FF >> 8;
int b = p & 0x000000FF;
image[idx] = (int) ( ( r + g + b ) / 3.0 );
}
}
int convolutionSize = 3;
int[][] convolution = { { 0, -1, 0 }, { -1, 4, -1 }, { 0, -1, 0 } };
int[] newImage = new int[w * h];
// Apply the convolution to the whole image, note that we start at
// 1 instead 0 zero to avoid out-of-bounds access
for ( int y = 1; y + 1 < h; y++ ) {
for ( int x = 1; x + 1 < w; x++ ) {
int idx = ( y * w ) + x;
// Apply the convolution
for ( int cy = 0; cy < convolutionSize; cy++ ) {
for ( int cx = 0; cx < convolutionSize; cx++ ) {
int cIdx = ( ( ( y - 1 ) + cy ) * w )
+ ( ( x - 1 ) + cx );
newImage[idx] += convolution[cy][cx] * image[cIdx];
}
}
// pixel value rounding
if ( newImage[idx] < 0 ) {
newImage[idx] = -newImage[idx];
} else {
newImage[idx] = 0;
}
if ( newImage[idx] > 0 ) {
newImage[idx] = 120 - newImage[idx];
} else {
newImage[idx] = 255;
}
}
}
// Convert to "proper" grayscale
for ( int y = 0; y < h; y++ ) {
for ( int x = 0; x < w; x++ ) {
int idx = ( y * w ) + x;
int p = newImage[idx];
newImage[idx] = 0xFF000000 | ( p << 16 ) | ( p << 8 ) | p;
}
}
// Set the image to have the new values;
bufferedImage.setRGB(0, 0, w, h, newImage, 0, w);
// Write the new image as a PNG to avoid lossey compression,
// and its eaiser than trying to display an image in Java.
ImageIO.write(bufferedImage, "png", new File("new_apple.png"));
}
}
编辑:
修改代码以按预期工作。它不快,但它有效。
之前:
之后: