Hallo alle zusammen!
Habe im Studium folgende Aufgabe erhalten:
Schreiben Sie einen Filter, der ein Bild unscharf zeichnet. Ein mögliches Verfahren hierfür ist,
dass der Pixel im neuen Bild der Mittelwert aus dem Pixel im alten Bild und allen seinen
Nachbarn ist.
Das ganze soll mit ImageJ gemacht werden.
Ich habe mir bisher einen Kernel erzeugt,
dann eine Methode geschrieben, indem alle Rot, Grün und Blau-Anteile aus allen 9 betroffenen Pixeln gebaut werden und sie später alle zu einem int-Wert geschiftet.
Als letztes habe ich in der run()- Methode einmal eine geschachtelte for-Schleife, um über die Höhe und Breite des Ausgangsbildes zu iterieren,
und eine zweite geschachtelte for-Schleife, um über den Kernel zu iterieren.
Nur leider komme ich partout nicht weiter: Ich weiß, dass da wahrscheinlich irgendwo ein Denkfehler ist, komme aber leider nicht von alleine drauf. Es wäre vielleicht deshalb besser, wenn ein anderer Mal über meinen Code schauen könnte. Bitteee.
Ich sitze schon seit Tagen daran und komme nicht weiter.
Habe im Studium folgende Aufgabe erhalten:
Schreiben Sie einen Filter, der ein Bild unscharf zeichnet. Ein mögliches Verfahren hierfür ist,
dass der Pixel im neuen Bild der Mittelwert aus dem Pixel im alten Bild und allen seinen
Nachbarn ist.
Das ganze soll mit ImageJ gemacht werden.
Ich habe mir bisher einen Kernel erzeugt,
Java:
double[][] kernel = {
{3, 5, 3},
{5, 8, 5},
{3, 5, 3}
};
dann eine Methode geschrieben, indem alle Rot, Grün und Blau-Anteile aus allen 9 betroffenen Pixeln gebaut werden und sie später alle zu einem int-Wert geschiftet.
Java:
public int getInterpolatedPixel(Point point, double [][] kernel, ImageProcessor ipOld) {
int x = point.x;
int xLinks = x - 1;
int xRechts = x + 1;
int y = point.y;
int yOben = y - 1;
int yUnten = y + 1;
// Neun Color-Objekte fuer alle 9 betroffenen Pixel
final Color c1 = new Color(ipOld.getPixel(xLinks, yOben));
final Color c2 = new Color(ipOld.getPixel(x, yOben));
final Color c3 = new Color(ipOld.getPixel(xRechts, yOben));
final Color c4 = new Color(ipOld.getPixel(xLinks, y));
final Color c5 = new Color(ipOld.getPixel(x, y));
final Color c6 = new Color(ipOld.getPixel(xRechts, y));
final Color c7 = new Color(ipOld.getPixel(xLinks, yUnten));
final Color c8 = new Color(ipOld.getPixel(x, yUnten));
final Color c9 = new Color(ipOld.getPixel(xRechts, yUnten));
// Interpolation der Rot-Anteile der jeweiligen Pixel
int red = (int) ((kernel[0][0] * c1.getRed()) + (kernel[0][1] * c2.getRed()) + (kernel[0][2] * c3.getRed()) +
(kernel[1][0] * c4.getRed()) + (kernel[1][1] * c5.getRed()) + (kernel[1][2] * c6.getRed()) +
(kernel[2][0] * c7.getRed()) + (kernel[2][1] * c8.getRed()) + (kernel[2][2] * c9.getRed())) / 40;
// Interpolation der Gruen-Anteile der jeweiligen Pixel
int green = (int) ((kernel[0][0] * c1.getGreen()) + (kernel[0][1] * c2.getGreen()) + (kernel[0][2] * c3.getGreen()) +
(kernel[1][0] * c4.getGreen()) + (kernel[1][1] * c5.getGreen()) + (kernel[1][2] * c6.getGreen()) +
(kernel[2][0] * c7.getGreen()) + (kernel[2][1] * c8.getGreen()) + (kernel[2][2] * c9.getGreen()))/ 40;
// Interpolation der Blau-Anteile der jeweiligen Pixel
int blue = (int) ((kernel[0][0] * c1.getBlue()) + (kernel[0][1] * c2.getBlue()) + (kernel[0][2] * c3.getBlue()) +
(kernel[1][0] * c4.getBlue()) + (kernel[1][1] * c5.getBlue()) + (kernel[1][2] * c6.getBlue()) +
(kernel[2][0] * c7.getBlue()) + (kernel[2][1] * c8.getBlue()) + (kernel[2][2] * c9.getBlue()))/ 40;
// errechneter int-Wert aus allen umliegenden Pixeln
return (0xff<<24) | (red << 16) | (green << 8) | blue;
}
Als letztes habe ich in der run()- Methode einmal eine geschachtelte for-Schleife, um über die Höhe und Breite des Ausgangsbildes zu iterieren,
und eine zweite geschachtelte for-Schleife, um über den Kernel zu iterieren.
Java:
public void run(String arg) {
imp.show();
final ImageProcessor ipOld = imp.getProcessor();
final ImagePlus newImage = NewImage.createRGBImage( "Blurred Image", ipOld.getWidth(), ipOld.getHeight(), 1, NewImage.FILL_BLACK );
final ImageProcessor ipNew = newImage.getProcessor();
int w = ipOld.getWidth();
int h = ipOld.getHeight();
final int[] pixNew = (int[])ipNew.getPixels();
double[][] kernel = {
{3, 5, 3},
{5, 8, 5},
{3, 5, 3}
};
for (int v = 1; v <= - 2; v++ ) {
for (int u = 1; u <= w - 2; u++) {
double sum = 0;
for (int i = 0; i < kernel.length; ++i) {
for (int j = 0; j < kernel[0].length; ++j) {
int pix = (int) (getInterpolatedPixel(new Point(u, v), kernel, ipOld));
pixNew[v + u ] = pix;
}
}
}
}
newImage.show();
}
Nur leider komme ich partout nicht weiter: Ich weiß, dass da wahrscheinlich irgendwo ein Denkfehler ist, komme aber leider nicht von alleine drauf. Es wäre vielleicht deshalb besser, wenn ein anderer Mal über meinen Code schauen könnte. Bitteee.
Ich sitze schon seit Tagen daran und komme nicht weiter.