Ho aperto un topic questo pomeriggio ma dato che non ho rispettato le regole chiedendo di potermi scrivere una funzione main mi è stato giustamente chiuso, chiedo scusa anzi per la mia poca attenzione al regolamento, vorrei allora provare a riformulare un dubbio che avevo già scritto lì e che credo non vada contro a nessuna regola... Devo scrivere una funzione main che utilizzi questi 4 sorgenti sotto descritti, ma prima ancora di scriverla mi trovo davanti ad una spaventosa constatazione: messo agli atti che i sorgenti sono INDUBBIAMENTE corretti, in quanto reperiti da un libro di testo abbastanza autorevole, bisogna purtroppo constatare che non si riesce a compilarli. Alcune loro funzioni sono protected dal package scritto dal manuale, che ho pensato bene di eliminare, rendendo pubbliche le funzioni; questo mi è servito per compilare due sorgenti, ma già al terzo riscontro di nuovo degli errori. Vi scrivo i sorgenti.
Sono in tutto quattro file: StandardGreyOp.java, BinaryMorphologicalOp.java, BinaryDilateOp.java, BinaryErodeOp.java.
BinaryDilateOp e BinaryErodeOp estendono BinaryMorphologicalOp, che a sua volta estende StandardGreyOp.
StandardGreyOp
BinaryMorphologicalOpcodice:package com.pearsoneduc.ip.op; import java.awt.RenderingHints; import java.awt.geom.*; import java.awt.image.*; /** * Implements a BufferedImageOp for standard operations on 8-bit * greyscale images. Subclasses should override the * {@link #filter(BufferedImage, RenderingHints) filter()} method * to carry out processing. * * @author Nick Efford * @version 1.1 [1999/07/23] */ public class StandardGreyOp implements BufferedImageOp { /** * Performs an operation on an image. Here, the operation is a * simple copy of source to destination. Subclasses must override * this method to produce more interesting behaviour. * @param src source image * @param dest destination image, or null * @return destination image. */ public BufferedImage filter(BufferedImage src, BufferedImage dest) { checkImage(src); if (dest == null) dest = createCompatibleDestImage(src, null); WritableRaster raster = dest.getRaster(); src.copyData(raster); return dest; } /** * Creates a zeroed destination image with the same dimensions * and number of bands as the source image. * @param src source image * @param destModel ColorModel of the destination image * (if null, ColorModel of the source image will be used) */ public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destModel) { if (destModel == null) destModel = src.getColorModel(); int width = src.getWidth(); int height = src.getHeight(); BufferedImage image = new BufferedImage(destModel, destModel.createCompatibleWritableRaster(width, height), destModel.isAlphaPremultiplied(), null); return image; } /** * Determines bounding box of the destination image. Here, it is * assumed that this is identical to that of the source image. * @param src source image * @return bounding box of the destination image. */ public Rectangle2D getBounds2D(BufferedImage src) { return src.getRaster().getBounds(); } /** * Given a point in the source image, determines the corresponding * point in the destination image. Here, it is assumed that this * will be the same as the point in the source image. * @param srcPoint a point from the source image * @param destPoint a point in the destination image, or null * @return point in the destination image. */ public Point2D getPoint2D(Point2D srcPoint, Point2D destPoint) { if (destPoint == null) destPoint = new Point2D.Float(); destPoint.setLocation(srcPoint.getX(), srcPoint.getY()); return destPoint; } /** * @return rendering hints for this operation. */ public RenderingHints getRenderingHints() { return null; } /** * Tests that source image is suitable for processing. * @param src source image * @exception ImagingOpException if the source image is not an * 8-bit greyscale image. */ public void checkImage(BufferedImage src) { if (src.getType() != BufferedImage.TYPE_BYTE_GRAY) throw new ImagingOpException("operation requires an 8-bit grey image"); } }
codice:package com.pearsoneduc.ip.op; import java.awt.image.*; /** * Adapts StandardGreyOp for binary morphological operations. * The method checkImage() is overridden to check that the source * image is either a true binary image or a greyscale image with * no more than two grey levels. * * @author Nick Efford * @version 1.0 [1999/08/30] */ public class BinaryMorphologicalOp extends StandardGreyOp { /////////////////////////// INSTANCE VARIABLES /////////////////////////// /** Non-zero value assigned to pixels in the output image. */ protected int nonZeroValue; //////////////////////////////// METHODS ///////////////////////////////// /** * Checks that the image to be processed is of the correct type - * either a true binary image or a two-level 8-bit greyscale image * with 0 as one of the values. * @param image image to be processed * @exception ImagingOpException if the image is not of the correct type. */ public void checkImage(BufferedImage image) { if (image.getType() == BufferedImage.TYPE_BYTE_BINARY) nonZeroValue = 1; else if (image.getType() == BufferedImage.TYPE_BYTE_GRAY) { nonZeroValue = 255; Raster raster = image.getRaster(); int[] hist = new int[256]; for (int y = 0; y < image.getHeight(); ++y) for (int x = 0; x < image.getWidth(); ++x) ++hist[raster.getSample(x, y, 0)]; int n = 0; for (int i = 1; i < 256; ++i) if (hist[i] > 0) { ++n; if (n > 1) throw new ImagingOpException( "image must be binary, or grey with <= one non-zero value"); } } else throw new ImagingOpException("invalid image type"); } }
BinaryDilateOp
codice:package com.pearsoneduc.ip.op; import java.awt.Point; import java.awt.image.*; /** * Performs the morphological operation of dilation on a binary image. * 'Binary image' is taken here to mean a greyscale image with just * two values, one of which is zero. * * @author Nick Efford * @version 1.0 [1999/08/30] */ public class BinaryDilateOp extends BinaryMorphologicalOp { /////////////////////////// INSTANCE VARIABLES /////////////////////////// /** Structuring element used to perform the dilation. */ private BinaryStructElement structElement; //////////////////////////////// METHODS ///////////////////////////////// /** * Creates a BinaryDilateOp that uses the specified structuring element. * @param element structuring element */ public BinaryDilateOp(BinaryStructElement element) { structElement = element; } /** * Performs morphological dilation of a binary image. * @param src source image * @param dest destination image, or null * @return dilated image. */ public BufferedImage filter(BufferedImage src, BufferedImage dest) { checkImage(src); if (dest == null) dest = createCompatibleDestImage(src, null); int w = src.getWidth(); int h = src.getHeight(); Raster srcRaster = src.getRaster(); WritableRaster destRaster = dest.getRaster(); // Determine range of pixels for which operation can be performed Point origin = structElement.getOrigin(null); int xmin = Math.max(origin.x, 0); int ymin = Math.max(origin.y, 0); int xmax = origin.x + w - structElement.getWidth(); int ymax = origin.y + h - structElement.getHeight(); xmax = Math.min(w-1, xmax); ymax = Math.min(h-1, ymax); // Intersect structuring element with source image for (int y = ymin; y <= ymax; ++y) for (int x = xmin; x <= xmax; ++x) if (structElement.hits(srcRaster, x, y)) destRaster.setSample(x, y, 0, nonZeroValue); return dest; } }
BinaryErodeOp
Quindi, in sostanza, qualcuno di voi saprebbe aiutarmi a capire perchè non riesco a compilarli?codice:package com.pearsoneduc.ip.op; import java.awt.Point; import java.awt.image.*; /** * Performs the morphological operation of erosion on a binary image. * 'Binary image' is taken here to mean a greyscale image with just * two values, one of which is zero. * * @author Nick Efford * @version 1.0 [1999/08/30] */ public class BinaryErodeOp extends BinaryMorphologicalOp { /////////////////////////// INSTANCE VARIABLES /////////////////////////// /** Structuring element used to perform the erosion. */ private BinaryStructElement structElement; //////////////////////////////// METHODS ///////////////////////////////// /** * Creates a BinaryErodeOp that uses the specified structuring element. * @param element structuring element */ public BinaryErodeOp(BinaryStructElement element) { structElement = element; } /** * Performs morphological erosion of a binary image. * @param src source image * @param dest destination image, or null * @return eroded image. */ public BufferedImage filter(BufferedImage src, BufferedImage dest) { checkImage(src); if (dest == null) dest = createCompatibleDestImage(src, null); int w = src.getWidth(); int h = src.getHeight(); Raster srcRaster = src.getRaster(); WritableRaster destRaster = dest.getRaster(); // Determine range of pixels for which operation can be performed Point origin = structElement.getOrigin(null); int xmin = Math.max(origin.x, 0); int ymin = Math.max(origin.y, 0); int xmax = origin.x + w - structElement.getWidth(); int ymax = origin.y + h - structElement.getHeight(); xmax = Math.min(w-1, xmax); ymax = Math.min(h-1, ymax); // Fit structuring element into source image for (int y = ymin; y <= ymax; ++y) for (int x = xmin; x <= xmax; ++x) if (structElement.fits(srcRaster, x, y)) destRaster.setSample(x, y, 0, nonZeroValue); return dest; } }
Togliendo il package il primo sorgente, StandardGreyOp.java, ed il secondo sorgente, BinaryMorphologicalOp, sono compilabili, e fin quì ok. Il terzo ed il quarto sorgente, che dovrebbero essere indipendenti l'uno dall'altro però mi danno questo errore:
![]()
Eppure più lo guardo e meno capisco cos'è che non va... Voi che ne pensate?

Rispondi quotando
