/** * Converts the buffered image into an {@link GrayI16}. If the buffered image * has multiple channels the intensities of each channel are averaged together. * * @param src Input image. * @param dst Where the converted image is written to. If null a new unsigned image is created. * @return Converted image. */ public static <T extends GrayI16>T convertFrom(BufferedImage src, T dst , Class<T> type ) { if (dst != null) { if (src.getWidth() != dst.getWidth() || src.getHeight() != dst.getHeight()) { throw new IllegalArgumentException("image dimension are different"); } } else { dst = GeneralizedImageOps.createSingleBand(type, src.getWidth(), src.getHeight()); } try { if (src.getRaster() instanceof ShortInterleavedRaster ) { ConvertRaster.bufferedToGray((ShortInterleavedRaster) src.getRaster(), dst); return dst; } } catch( java.security.AccessControlException e) {} // Applets don't allow access to the raster() or the image type wasn't supported ConvertRaster.bufferedToGray(src, dst); return dst; }
public static void vertical3(Kernel1D_S32 kernel , GrayS16 image, GrayI16 dest , int divisor ) { final short[] dataSrc = image.data; final short[] dataDst = dest.data; final int k1 = kernel.data[0]; final int k2 = kernel.data[1]; final int k3 = kernel.data[2]; final int radius = kernel.getRadius(); final int imgWidth = dest.getWidth(); final int imgHeight = dest.getHeight(); final int halfDivisor = divisor/2; final int yEnd = imgHeight-radius; for( int y = radius; y < yEnd; y++ ) { int indexDst = dest.startIndex+y*dest.stride; int i = image.startIndex + (y-radius)*image.stride; final int iEnd = i+imgWidth; for( ; i < iEnd; i++ ) { int indexSrc = i; int total = (dataSrc[indexSrc]) * k1; indexSrc += image.stride; total += (dataSrc[indexSrc])*k2; indexSrc += image.stride; total += (dataSrc[indexSrc])*k3; dataDst[indexDst++] = ( short )((total+halfDivisor)/divisor); } } }
public static void vertical3(Kernel1D_S32 kernel , GrayS16 image, GrayI16 dest ) { final short[] dataSrc = image.data; final short[] dataDst = dest.data; final int k1 = kernel.data[0]; final int k2 = kernel.data[1]; final int k3 = kernel.data[2]; final int radius = kernel.getRadius(); final int imgWidth = dest.getWidth(); final int imgHeight = dest.getHeight(); final int yEnd = imgHeight-radius; for( int y = radius; y < yEnd; y++ ) { int indexDst = dest.startIndex+y*dest.stride; int i = image.startIndex + (y-radius)*image.stride; final int iEnd = i+imgWidth; for( ; i < iEnd; i++ ) { int indexSrc = i; int total = (dataSrc[indexSrc]) * k1; indexSrc += image.stride; total += (dataSrc[indexSrc])*k2; indexSrc += image.stride; total += (dataSrc[indexSrc])*k3; dataDst[indexDst++] = ( short )total; } } }
public static void vertical3(Kernel1D_S32 kernel , GrayU8 image, GrayI16 dest ) { final byte[] dataSrc = image.data; final short[] dataDst = dest.data; final int k1 = kernel.data[0]; final int k2 = kernel.data[1]; final int k3 = kernel.data[2]; final int radius = kernel.getRadius(); final int imgWidth = dest.getWidth(); final int imgHeight = dest.getHeight(); final int yEnd = imgHeight-radius; for( int y = radius; y < yEnd; y++ ) { int indexDst = dest.startIndex+y*dest.stride; int i = image.startIndex + (y-radius)*image.stride; final int iEnd = i+imgWidth; for( ; i < iEnd; i++ ) { int indexSrc = i; int total = (dataSrc[indexSrc]& 0xFF) * k1; indexSrc += image.stride; total += (dataSrc[indexSrc]& 0xFF)*k2; indexSrc += image.stride; total += (dataSrc[indexSrc]& 0xFF)*k3; dataDst[indexDst++] = ( short )total; } } }
final int imgHeight = dest.getHeight(); final int halfDivisor = divisor/2;
final int imgHeight = dest.getHeight();
final int imgHeight = dest.getHeight(); final int halfDivisor = divisor/2;
final int imgHeight = dest.getHeight();
final int imgHeight = dest.getHeight();
final int imgHeight = dest.getHeight();
final int imgHeight = dest.getHeight(); final int halfDivisor = divisor/2;
final int imgHeight = dest.getHeight(); final int halfDivisor = divisor/2;
public static void vertical( Kernel1D_S32 kernel, GrayU8 image, GrayI16 dest ) { final byte[] dataSrc = image.data; final short[] dataDst = dest.data; final int[] dataKer = kernel.data; final int offset = kernel.getOffset(); final int kernelWidth = kernel.getWidth(); final int imgWidth = dest.getWidth(); final int imgHeight = dest.getHeight(); final int yEnd = imgHeight-(kernelWidth-offset-1); for( int y = offset; y < yEnd; y++ ) { int indexDst = dest.startIndex+y*dest.stride; int i = image.startIndex + (y-offset)*image.stride; final int iEnd = i+imgWidth; for( ; i < iEnd; i++ ) { int total = 0; int indexSrc = i; for( int k = 0; k < kernelWidth; k++ ) { total += (dataSrc[indexSrc] & 0xFF)* dataKer[k]; indexSrc += image.stride; } dataDst[indexDst++] = (short)total; } } }
public static void vertical( Kernel1D_S32 kernel, GrayS16 image, GrayI16 dest , int divisor ) { final short[] dataSrc = image.data; final short[] dataDst = dest.data; final int[] dataKer = kernel.data; final int offset = kernel.getOffset(); final int kernelWidth = kernel.getWidth(); final int halfDivisor = divisor/2; final int imgWidth = dest.getWidth(); final int imgHeight = dest.getHeight(); final int yEnd = imgHeight-(kernelWidth-offset-1); for( int y = offset; y < yEnd; y++ ) { int indexDst = dest.startIndex+y*dest.stride; int i = image.startIndex + (y-offset)*image.stride; final int iEnd = i+imgWidth; for( ; i < iEnd; i++ ) { int total = 0; int indexSrc = i; for( int k = 0; k < kernelWidth; k++ ) { total += (dataSrc[indexSrc] )* dataKer[k]; indexSrc += image.stride; } dataDst[indexDst++] = (short)((total+halfDivisor)/divisor); } } }
public static void vertical( Kernel1D_S32 kernel, GrayS32 image, GrayI16 dest , int divisor ) { final int[] dataSrc = image.data; final short[] dataDst = dest.data; final int[] dataKer = kernel.data; final int offset = kernel.getOffset(); final int kernelWidth = kernel.getWidth(); final int halfDivisor = divisor/2; final int imgWidth = dest.getWidth(); final int imgHeight = dest.getHeight(); final int yEnd = imgHeight-(kernelWidth-offset-1); for( int y = offset; y < yEnd; y++ ) { int indexDst = dest.startIndex+y*dest.stride; int i = image.startIndex + (y-offset)*image.stride; final int iEnd = i+imgWidth; for( ; i < iEnd; i++ ) { int total = 0; int indexSrc = i; for( int k = 0; k < kernelWidth; k++ ) { total += (dataSrc[indexSrc] )* dataKer[k]; indexSrc += image.stride; } dataDst[indexDst++] = (short)((total+halfDivisor)/divisor); } } }
/** * A faster convert that works directly with a specific raster */ public static void bufferedToGray(ShortInterleavedRaster src, GrayI16 dst) { short[] srcData = src.getDataStorage(); int numBands = src.getNumBands(); int size = dst.getWidth() * dst.getHeight(); int srcStride = src.getScanlineStride(); int srcOffset = getOffset(src); int srcStrideDiff = srcStride-src.getPixelStride()*dst.width; if (numBands == 1) { if (dst.startIndex == 0 && dst.width == dst.stride && srcStrideDiff == 0 && srcOffset == 0 ) System.arraycopy(srcData, 0, dst.data, 0, size); else { for (int y = 0; y < dst.height; y++) { int indexDst = dst.startIndex + dst.stride * y; int indexSrc = srcOffset + srcStride * y; System.arraycopy(srcData, indexSrc, dst.data, indexDst, dst.width); } } } else { throw new RuntimeException("Only single band images are currently support for 16bit"); } }
public static void vertical( Kernel1D_S32 kernel, GrayS16 image, GrayI16 dest ) { final short[] dataSrc = image.data; final short[] dataDst = dest.data; final int[] dataKer = kernel.data; final int offset = kernel.getOffset(); final int kernelWidth = kernel.getWidth(); final int imgWidth = dest.getWidth(); final int imgHeight = dest.getHeight(); final int yEnd = imgHeight-(kernelWidth-offset-1); for( int y = offset; y < yEnd; y++ ) { int indexDst = dest.startIndex+y*dest.stride; int i = image.startIndex + (y-offset)*image.stride; final int iEnd = i+imgWidth; for( ; i < iEnd; i++ ) { int total = 0; int indexSrc = i; for( int k = 0; k < kernelWidth; k++ ) { total += (dataSrc[indexSrc] )* dataKer[k]; indexSrc += image.stride; } dataDst[indexDst++] = (short)total; } } }
final int imgHeight = output.getHeight();
public static void horizontal(Kernel1D_S32 kernel, ImageBorder_S32 input, GrayI16 output ) { final short[] dataDst = output.data; final int[] dataKer = kernel.data; final int offset = kernel.getOffset(); final int kernelWidth = kernel.getWidth(); final int width = output.getWidth(); final int height = output.getHeight(); final int borderRight = kernelWidth-offset-1; for (int y = 0; y < height; y++) { int indexDest = output.startIndex + y * output.stride; for ( int x = 0; x < offset; x++ ) { int total = 0; for (int k = 0; k < kernelWidth; k++) { total += input.get(x+k-offset,y) * dataKer[k]; } dataDst[indexDest++] = (short)total; } indexDest = output.startIndex + y * output.stride + width-borderRight; for ( int x = width-borderRight; x < width; x++ ) { int total = 0; for (int k = 0; k < kernelWidth; k++) { total += input.get(x+k-offset,y) * dataKer[k]; } dataDst[indexDest++] = (short)total; } } }
public static void vertical(Kernel1D_S32 kernel, ImageBorder_S32 input, GrayI16 output ) { final short[] dataDst = output.data; final int[] dataKer = kernel.data; final int offset = kernel.getOffset(); final int kernelWidth = kernel.getWidth(); final int width = output.getWidth(); final int height = output.getHeight(); final int borderBottom = kernelWidth-offset-1; for ( int x = 0; x < width; x++ ) { int indexDest = output.startIndex + x; for (int y = 0; y < offset; y++, indexDest += output.stride) { int total = 0; for (int k = 0; k < kernelWidth; k++) { total += input.get(x,y+k-offset) * dataKer[k]; } dataDst[indexDest] = (short)total; } indexDest = output.startIndex + (height-borderBottom) * output.stride + x; for (int y = height-borderBottom; y < height; y++, indexDest += output.stride) { int total = 0; for (int k = 0; k < kernelWidth; k++ ) { total += input.get(x,y+k-offset) * dataKer[k]; } dataDst[indexDest] = (short)total; } } }