在Java中实现修改的Sketch生成

我在最后一年Engg.i希望实现草图生成算法,并对我的最后一年项目进行一些修改。为此,我希望访问和修改像素强度值(不是以RGB为单位,而是以数字表示为虽然算法在matlab中运行良好,但是由于项目的要求,我打算用Java来实现。 通过互联网和各种Java论坛没有帮助我。
Matlab代码允许我使用以下代码段访问像素
120,234处的像素强度值由“A(120,234)”给出,其中A是所考虑的图像的名称。
类似地,我想访问Java中图像的像素强度值,并使用算法修改它们。
如果有人帮助我,我会很高兴。
提前致谢

既然您可以访问matlab,我建议深入研究他们的代码,假设他们的图像内容是用Matlab编写的,我认为是这样,并看看他们如何将RGB转换为强度。 他们使用HSL(色调 – 饱和度 – 亮度)吗? 或者其他一些颜色转换。 知道了,您可以找到Java代码将RGB转换为HSL。

编辑:
根据对这个问题的评论,我认为这段代码可行。 它不完整,因为我没有复制和重写所有的操作,但它应该给你的想法。

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")); } } 

编辑:
修改代码以按预期工作。 它不快,但它的工作原理。
之前:
之前

后:
后

在我看来,你想要使用的是bufferedImage ,你可以从中获得一个可用于读/写像素值的writableRaster 。

有关与bufferedImage交互的几种方法,另请参阅本教程 。