void convolve(ImageProcessor ip1, ImageProcessor ip2, float[] pixelsKernel) { final Convolver c = new Convolver(); //ImagePlus imp = new ImagePlus("ip", ip1); //imp.show(); //(new ImagePlus("pixelKernel", new FloatProcessor(size, size, pixelsKernel, null))).show(); boolean b = c.convolveFloat(ip1, pixelsKernel, size, size); if(!b) { IJ.error("Error while convolving first image with kernel!"); return; } //(new ImagePlus("convoluted ip1", ip1)).show(); final Convolver c2 = new Convolver(); b = c2.convolveFloat(ip2, pixelsKernel, size, size); if(!b) { IJ.error("Error while convolving second image with kernel!"); return; } }
/** * smoothing by 3*3 box filter */ private void smooth(float[] dIdu, int size) { float[] kernel = {1f / 3f, 1f / 3f, 1f / 3f}; Convolver convolver = new Convolver(); FloatProcessor imp = new FloatProcessor(size - 1, size - 1, dIdu, null); convolver.convolve(imp, kernel, kernel.length, 1); convolver.convolve(imp, kernel, 1, kernel.length); }
/** Convolves the image <code>ip</code> with a kernel of width <code>kw</code> and height <code>kh</code>. */ public void convolveFloat1D(FloatProcessor ip, float[] kernel, int kw, int kh) { convolveFloat1D(ip, kernel, kw, kh, normalize?getScale(kernel):1.0); }
/** Convolves <code>ip</code> with a kernel of width <code>kw</code> and height <code>kh</code>. Returns false if the user cancels the operation. */ public boolean convolve(ImageProcessor ip, float[] kernel, int kw, int kh) { if (canceled || kw*kh!=kernel.length) return false; if ((kw&1)!=1 || (kh&1)!=1) throw new IllegalArgumentException("Kernel width or height not odd ("+kw+"x"+kh+")"); boolean notFloat = !(ip instanceof FloatProcessor); ImageProcessor ip2 = ip; if (notFloat) { if (ip2 instanceof ColorProcessor) throw new IllegalArgumentException("RGB images not supported"); ip2 = ip2.convertToFloat(); } if (kw==1 || kh==1) convolveFloat1D((FloatProcessor)ip2, kernel, kw, kh, normalize?getScale(kernel):1.0); else convolveFloat(ip2, kernel, kw, kh); if (notFloat) { if (ip instanceof ByteProcessor) ip2 = ip2.convertToByte(false); else ip2 = ip2.convertToShort(false); ip.setPixels(ip2.getPixels()); } return !canceled; }
if (pixels2==null) pixels2 = (float[])ip.getPixelsCopy(); double scale = normalize?getScale(kernel):1.0; Thread thread = Thread.currentThread(); boolean isMainThread = thread==mainThread || thread.getName().indexOf("Preview")!=-1; return false; showProgress((y-y1)/(double)(y2-y1)); if (i>=kernel.length) // work around for JIT compiler bug on Linux IJ.log("kernel index error: "+i); sum += getPixel(x+u, y+v, pixels2, width, height)*kernel[i++]; } else sum += pixels2[offset+u]*kernel[i++];
public void run(ImageProcessor ip) { if (canceled) return; if (isLineRoi) ip.resetRoi(); if (!kernelError) convolve(ip, kernel, kw, kh); }
boolean decodeKernel(String text) { if (Macro.getOptions()!=null && !hasNewLine(text)) return decodeSquareKernel(text); String[] rows = Tools.split(text, "\n"); kh = rows.length;
public boolean dialogItemChanged(GenericDialog gd, AWTEvent e) { kernelText = gd.getNextText(); normalizeFlag = gd.getNextBoolean(); normalize = normalizeFlag; kernelError = !decodeKernel(kernelText); if (!kernelError) { IJ.showStatus("Convolve: "+kw+"x"+kh+" kernel"); return true; } else return !gd.isPreviewActive(); }
for(int v=-vc; v<=vc; v++) { if (edgePixel) sum += getPixel(x+uc, y+v, pixels2, width, height)*kernel[i++]; else sum += pixels2[offset+uc]*kernel[i++]; for(int u = -uc; u<=uc; u++) { if (edgePixel) sum += getPixel(x+u, y+vc, pixels2, width, height)*kernel[i++]; else sum += pixels2[offset+u]*kernel[i++];
/** Convolves <code>ip</code> with a kernel of width <code>kw</code> and height <code>kh</code>. Returns false if the user cancels the operation. */ public boolean convolve(ImageProcessor ip, float[] kernel, int kw, int kh) { if (canceled || kw*kh!=kernel.length) return false; if ((kw&1)!=1 || (kh&1)!=1) throw new IllegalArgumentException("Kernel width or height not odd ("+kw+"x"+kh+")"); boolean notFloat = !(ip instanceof FloatProcessor); ImageProcessor ip2 = ip; if (notFloat) { if (ip2 instanceof ColorProcessor) throw new IllegalArgumentException("RGB images not supported"); ip2 = ip2.convertToFloat(); } if (kw==1 || kh==1) convolveFloat1D((FloatProcessor)ip2, kernel, kw, kh, normalize?getScale(kernel):1.0); else convolveFloat(ip2, kernel, kw, kh); if (notFloat) { if (ip instanceof ByteProcessor) ip2 = ip2.convertToByte(false); else ip2 = ip2.convertToShort(false); ip.setPixels(ip2.getPixels()); } return !canceled; }
if (pixels2==null) pixels2 = (float[])ip.getPixelsCopy(); double scale = normalize?getScale(kernel):1.0; Thread thread = Thread.currentThread(); boolean isMainThread = thread==mainThread || thread.getName().indexOf("Preview")!=-1; return false; showProgress((y-y1)/(double)(y2-y1)); if (i>=kernel.length) // work around for JIT compiler bug on Linux IJ.log("kernel index error: "+i); sum += getPixel(x+u, y+v, pixels2, width, height)*kernel[i++]; } else sum += pixels2[offset+u]*kernel[i++];
public void run(ImageProcessor ip) { if (canceled) return; if (isLineRoi) ip.resetRoi(); if (!kernelError) convolve(ip, kernel, kw, kh); }
boolean decodeKernel(String text) { if (Macro.getOptions()!=null && !hasNewLine(text)) return decodeSquareKernel(text); String[] rows = Tools.split(text, "\n"); kh = rows.length;
public boolean dialogItemChanged(GenericDialog gd, AWTEvent e) { kernelText = gd.getNextText(); normalizeFlag = gd.getNextBoolean(); normalize = normalizeFlag; kernelError = !decodeKernel(kernelText); if (!kernelError) { IJ.showStatus("Convolve: "+kw+"x"+kh+" kernel"); return true; } else return !gd.isPreviewActive(); }
for(int v=-vc; v<=vc; v++) { if (edgePixel) sum += getPixel(x+uc, y+v, pixels2, width, height)*kernel[i++]; else sum += pixels2[offset+uc]*kernel[i++]; for(int u = -uc; u<=uc; u++) { if (edgePixel) sum += getPixel(x+u, y+vc, pixels2, width, height)*kernel[i++]; else sum += pixels2[offset+u]*kernel[i++];
void convolve(ImageProcessor ip1, ImageProcessor ip2, float[] pixelsKernel) { final Convolver c = new Convolver(); //ImagePlus imp = new ImagePlus("ip", ip1); //imp.show(); //(new ImagePlus("pixelKernel", new FloatProcessor(size, size, pixelsKernel, null))).show(); boolean b = c.convolveFloat(ip1, pixelsKernel, size, size); if(!b) { IJ.error("Error while convolving first image with kernel!"); return; } //(new ImagePlus("convoluted ip1", ip1)).show(); final Convolver c2 = new Convolver(); b = c2.convolveFloat(ip2, pixelsKernel, size, size); if(!b) { IJ.error("Error while convolving second image with kernel!"); return; } }
/** Performs a convolution operation using the specified kernel. */ public void convolve(float[] kernel, int kernelWidth, int kernelHeight) { snapshot(); new ij.plugin.filter.Convolver().convolve(this, kernel, kernelWidth, kernelHeight); }
/** Convolves the image <code>ip</code> with a kernel of width <code>kw</code> and height <code>kh</code>. */ public void convolveFloat1D(FloatProcessor ip, float[] kernel, int kw, int kh) { convolveFloat1D(ip, kernel, kw, kh, normalize?getScale(kernel):1.0); }
public ImagePlus call(){ final int patchSize = filter.getWidth(); Convolver c = new Convolver(); float[] kernel = (float[]) filter.getPixels(); ImageProcessor ip = originalImage.getProcessor().duplicate(); c.convolveFloat(ip, kernel, patchSize, patchSize); return new ImagePlus (title, ip); } };
/** Performs a convolution operation using the specified kernel. */ public void convolve(float[] kernel, int kernelWidth, int kernelHeight) { snapshot(); new ij.plugin.filter.Convolver().convolve(this, kernel, kernelWidth, kernelHeight); }