/** * Determines whether a kernel is the Floyd-Steinberg kernel. * * @param kernel The <code>KernelJAI</code> to examine. * @return Whether the kernel argument is the Floyd-Steinberg kernel. */ private static boolean isFloydSteinbergKernel(KernelJAI kernel) { int ky = kernel.getYOrigin(); return (kernel.getWidth() == 3 && kernel.getXOrigin() == 1 && kernel.getHeight() - ky == 2 && Math.abs(kernel.getElement(2, ky) - 7.0F / 16.0F) < FLOAT_EPSILON && Math.abs(kernel.getElement(0, ky + 1) - 3.0F / 16.0F) < FLOAT_EPSILON && Math.abs(kernel.getElement(1, ky + 1) - 5.0F / 16.0F) < FLOAT_EPSILON && Math .abs(kernel.getElement(2, ky + 1) - 1.0F / 16.0F) < FLOAT_EPSILON); }
/** * Determines whether a kernel is the Floyd-Steinberg kernel. * * @param kernel The <code>KernelJAI</code> to examine. * @return Whether the kernel argument is the Floyd-Steinberg kernel. */ private static boolean isFloydSteinbergKernel(KernelJAI kernel) { int ky = kernel.getYOrigin(); return (kernel.getWidth() == 3 && kernel.getXOrigin() == 1 && kernel.getHeight() - ky == 2 && Math.abs(kernel.getElement(2, ky) - 7.0F / 16.0F) < FLOAT_EPSILON && Math.abs(kernel.getElement(0, ky + 1) - 3.0F / 16.0F) < FLOAT_EPSILON && Math.abs(kernel.getElement(1, ky + 1) - 5.0F / 16.0F) < FLOAT_EPSILON && Math .abs(kernel.getElement(2, ky + 1) - 1.0F / 16.0F) < FLOAT_EPSILON); }
return new KernelJAI(w, h, kernel.getXOrigin(), kernel.getYOrigin(), data);
return new KernelJAI(w, h, kernel.getXOrigin(), kernel.getYOrigin(), data);
kernelH = kernel.getHeight(); kernelKeyX = kernel.getXOrigin(); kernelKeyY = kernel.getYOrigin();
/** * Divides a kernel by some number. * * @param kernel The kernel to divide. * @param denominator The factor to divide by. * @return The resulting kernel. */ private static KernelJAI divide(KernelJAI kernel, final double denominator) { if (denominator != 1) { final float[] data = kernel.getKernelData(); final int length = data.length; for (int i=0; i<length; i++) { data[i] /= denominator; } kernel = new KernelJAI(kernel.getWidth(), kernel.getHeight(), kernel.getXOrigin(), kernel.getYOrigin(), data); } return kernel; }
/** * Divides a kernel by some number. * * @param kernel The kernel to divide. * @param denominator The factor to divide by. * @return The resulting kernel. */ private static KernelJAI divide(KernelJAI kernel, final double denominator) { if (denominator != 1) { final float[] data = kernel.getKernelData(); final int length = data.length; for (int i=0; i<length; i++) { data[i] /= denominator; } kernel = new KernelJAI(kernel.getWidth(), kernel.getHeight(), kernel.getXOrigin(), kernel.getYOrigin(), data); } return kernel; }
/** * Create a copy of the input kernel with element values * standardized to sum to 1.0. The input kernel's * dimensions and location of the key element are retained * by the new kernel. * * @param kernel the input kernel * @return a new KernelJAI object */ public static KernelJAI standardize(KernelJAI kernel) { float[] data = kernel.getKernelData(); float sum = 0f; for (float f : data) { sum += f; } for (int i = 0; i < data.length; i++) { data[i] /= sum; } return new KernelJAI( kernel.getWidth(), kernel.getHeight(), kernel.getXOrigin(), kernel.getYOrigin(), data); }
/** * Create a copy of the input kernel with element values * standardized to sum to 1.0. The input kernel's * dimensions and location of the key element are retained * by the new kernel. * * @param kernel the input kernel * @return a new KernelJAI object */ public static KernelJAI standardize(KernelJAI kernel) { float[] data = kernel.getKernelData(); float sum = 0f; for (float f : data) { sum += f; } for (int i = 0; i < data.length; i++) { data[i] /= sum; } return new KernelJAI( kernel.getWidth(), kernel.getHeight(), kernel.getXOrigin(), kernel.getYOrigin(), data); }
/** * Create a copy of the input kernel with element values * standardized to sum to 1.0. The input kernel's * dimensions and location of the key element are retained * by the new kernel. * * @param kernel the input kernel * @return a new KernelJAI object */ public static KernelJAI standardize(KernelJAI kernel) { float[] data = kernel.getKernelData(); float sum = 0f; for (float f : data) { sum += f; } for (int i = 0; i < data.length; i++) { data[i] /= sum; } return new KernelJAI( kernel.getWidth(), kernel.getHeight(), kernel.getXOrigin(), kernel.getYOrigin(), data); }
/** * Create a copy of the input kernel with element values * standardized to sum to 1.0. The input kernel's * dimensions and location of the key element are retained * by the new kernel. * * @param kernel the input kernel * @return a new KernelJAI object */ public static KernelJAI standardize(KernelJAI kernel) { float[] data = kernel.getKernelData(); float sum = 0f; for (float f : data) { sum += f; } for (int i = 0; i < data.length; i++) { data[i] /= sum; } return new KernelJAI( kernel.getWidth(), kernel.getHeight(), kernel.getXOrigin(), kernel.getYOrigin(), data); }
kernelH = kernel.getHeight(); kernelKeyX = kernel.getXOrigin(); kernelKeyY = kernel.getYOrigin();
int numLinesBuffer = errorKernel.getHeight() - errorKernel.getYOrigin(); float[] kernelData = errorKernel.getKernelData(); int diffuseRight = kernelWidth - errorKernel.getXOrigin() - 1; int diffuseBelow = errorKernel.getHeight() - errorKernel.getYOrigin() - 1; int kernelOffsetRight = errorKernel.getYOrigin() * kernelWidth + errorKernel.getXOrigin() + 1; int kernelOffsetBelow = (errorKernel.getYOrigin() + 1) * kernelWidth;
int numLinesBuffer = errorKernel.getHeight() - errorKernel.getYOrigin(); float[] kernelData = errorKernel.getKernelData(); int diffuseRight = kernelWidth - errorKernel.getXOrigin() - 1; int diffuseBelow = errorKernel.getHeight() - errorKernel.getYOrigin() - 1; int kernelOffsetRight = errorKernel.getYOrigin() * kernelWidth + errorKernel.getXOrigin() + 1; int kernelOffsetBelow = (errorKernel.getYOrigin() + 1) * kernelWidth;
int value = kernel.getYOrigin(); for (int y=height; --y>=0;) { for (int x=width; --x>=0;) {
int value = kernel.getYOrigin(); for (int y=height; --y>=0;) { for (int x=width; --x>=0;) {
public SeparableConvolveOpImage(RenderedImage source, BorderExtender extender, RenderingHints hints, ImageLayout l, KernelJAI kernel, ROI roi, Range noData, double destinationNoData, boolean skipNoData) { super(source, extender, hints, l, kernel, roi, noData, destinationNoData, skipNoData); // TODO Auto-generated constructor stub this.kernel = kernel; kw = kernel.getWidth(); kh = kernel.getHeight(); kx = kernel.getXOrigin(); ky = kernel.getYOrigin(); hValues = kernel.getHorizontalKernelData(); vValues = kernel.getVerticalKernelData(); if (sampleModel.getDataType() == DataBuffer.TYPE_BYTE) { hTables = new float[hValues.length][256]; for (int i = 0; i < hValues.length; i++) { float k = hValues[i]; for (int j = 0; j < 256; j++) { byte b = (byte)j; float f = (float)j; hTables[i][b+128] = hasNoData && noData.contains(b) ? 0 : k*f; } } } }
public Convolve3x3OpImage(RenderedImage source, BorderExtender extender, RenderingHints hints, ImageLayout l, KernelJAI kernel, ROI roi, Range noData, double destinationNoData, boolean skipNoData) { super(source, extender, hints, l, kernel, roi, noData, destinationNoData, skipNoData); this.kernel = kernel; if ((kernel.getWidth() != 3) || (kernel.getHeight() != 3) || (kernel.getXOrigin() != 1) || (kernel.getYOrigin() != 1)) { throw new RuntimeException(JaiI18N.getString("Convolve3x3OpImage0")); } if (sampleModel.getDataType() == DataBuffer.TYPE_BYTE) { float kdata[] = kernel.getKernelData(); float k0 = kdata[0], k1 = kdata[1], k2 = kdata[2], k3 = kdata[3], k4 = kdata[4], k5 = kdata[5], k6 = kdata[6], k7 = kdata[7], k8 = kdata[8]; for (int j = 0; j < 256; j++) { byte b = (byte) j; float f = (float) j; // noData Check tables[0][b + 128] = hasNoData && noData.contains(b) ? 0.5f : k0 * f + 0.5f; tables[1][b + 128] = hasNoData && noData.contains(b) ? 0 : k1 * f; tables[2][b + 128] = hasNoData && noData.contains(b) ? 0 : k2 * f; tables[3][b + 128] = hasNoData && noData.contains(b) ? 0 : k3 * f; tables[4][b + 128] = hasNoData && noData.contains(b) ? 0 : k4 * f; tables[5][b + 128] = hasNoData && noData.contains(b) ? 0 : k5 * f; tables[6][b + 128] = hasNoData && noData.contains(b) ? 0 : k6 * f; tables[7][b + 128] = hasNoData && noData.contains(b) ? 0 : k7 * f; tables[8][b + 128] = hasNoData && noData.contains(b) ? 0 : k8 * f; } } }
kh = kernel.getHeight(); kx = kernel.getXOrigin(); ky = kernel.getYOrigin();
boolean dataTypeOk = (dataType == DataBuffer.TYPE_BYTE || dataType == DataBuffer.TYPE_SHORT || dataType == DataBuffer.TYPE_INT); if (kernel.getWidth() == 3 && kernel.getHeight() == 3 && kernel.getXOrigin() == 1 && kernel.getYOrigin() == 1 && dataTypeOk) { return new Convolve3x3OpImage(img, extender, hints, l, kernel, roi, nodata, destinationNoData, skipNoData);