import ij.*;
import ij.gui.*;
import java.awt.*;
import ij.plugin.filter.PlugInFilter;
import ij.process.*;
/**
* Graubildtest
*
* Klasse zum Testen von BV-Algorithmen in Graubildern
*/
public class Graubild_Test implements PlugInFilter {
/** Initialisierung in ImageJ */
public int setup(String arg, ImagePlus imp) {
if (arg.equals("about")) {
showAbout();
return DONE;
}
/* Zugelassen nur für 8-Bit Graubilder */
return DOES_8G + NO_CHANGES;
}
/** About Message zu diesem Plug-In. */
void showAbout() {
IJ.showMessage("Graubildtest", "Testprogramm");
}
/**
* Ausführende Funktion
*
* @param ip
* Image Processor. Klasse in ImageJ, beinhaltet das Bild und
* zugehörige Metadaten.
*/
public void run(ImageProcessor ip) {
/* get width, height and the region of interest */
int w = ip.getWidth();
int h = ip.getHeight();
Rectangle roi = ip.getRoi();
/*
* create a new image with the same size and copy the pixels of the
* original image
*/
ImagePlus corrected = NewImage.createByteImage("Corrected image", w, h, 1, NewImage.FILL_BLACK);
ImageProcessor cor_ip = corrected.getProcessor();
cor_ip.copyBits(ip, 0, 0, Blitter.COPY);
/* Pixel-Array des Eingabebildes */
byte[] pixelsin = (byte[]) ip.getPixels();
/* Pixelarray des neuen Bildes */
byte[] pixelsout = (byte[]) cor_ip.getPixels();
/* Bit Invertierung */
//doInvert(w, h, pixelsout, roi);
/* Reduce Colors */
//doReduceColors(4, w, h, pixelsout, roi);
/* Reduce Resolution */
doReduceResolution(cor_ip, roi);
corrected.show();
corrected.updateAndDraw();
}
private int[] getColors(int maxColor, int colors) {
if (colors <= 1)
return new int[] { maxColor };
int resColors[] = new int[colors];
resColors[0] = 0;
int step = maxColor / (colors - 1);
for (int i = 0; i < (colors - 1); i++) {
resColors[i + 1] = (i + 1) * step;
}
return resColors;
}
/* Aufgabe 3) */
private void doReduceResolution(ImageProcessor ip, Rectangle roi) {
/* Rows */
for (int x = roi.x; x < (roi.x + roi.width); x += 2) {
/* Cols */
for (int y = roi.y; y < (roi.y + roi.height); y += 2) {
/* Get 2*2 Pixels */
int x1y1 = ip.get(x, y);
int x2y1 = ip.get(x + 1, y);
int x1y2 = ip.get(x, y + 1);
int x2y2 = ip.get(x + 1, y + 1);
/* Change to match */
int median = (x1y1 + x2y1 + x1y2 + x2y2) / 4;
/* Put 2*2 Pixels */
ip.putPixel(x, y, median);
ip.putPixel(x + 1, y, median);
ip.putPixel(x, y + 1, median);
ip.putPixel(x + 1, y + 1, median);
}
}
}
/* Aufgabe 2) */
private void doReduceColors(int numColors, int srcWidth, int srcHeight, byte src[], Rectangle roi) {
int y = -1;
int x = 0;
for (int i = 0; i < src.length; i++) {
x = i % srcWidth;
if (i % srcHeight == 0)
y++;
/* Part of Region-of-Interest */
if (roi.contains(x, y)) {
int val = (int) src[i];
val = (val & 0xFF);
if (val < 42)
val = 0;
else if (val < 127)
val = 85;
else if (val < 212)
val = 170;
else
val = 255;
src[i] = (byte) val;
}
}
}
/* Aufgabe 1) */
private void doInvert(int srcWidth, int srcHeight, byte src[], Rectangle roi) {
int y = -1;
int x = 0;
for (int i = 0; i < src.length; i++) {
x = i % srcWidth;
if (i % srcHeight == 0)
y++;
/* Part of Region-of-Interest */
if (roi.contains(x, y))
src[i] = (byte) ~(src[i]);
}
}
}