Hai sob kali ini saya mau
nerusin tentang project saya yaitu image processing berikut adalah screenshoot
program yang pernah saya buat.seperti aplikasi photoshop ya sob hehehe,
Ya memang benar dulu waktu
saya kulyah smester 4 saya ingin menciptakan aplikasi mirip dengan photoshop
meskipun nggak mungkin :D. Akhirnya saya beli buku yang namanya “Dasar-dasar
Image Processing”.dimana didalam buku tersebut ada beberapa project untuk
menampilkan warna menampilkan warna memahami tentang Graphic 2D.oke langsung
saja saya mau share tentang Source Code Image Sukanya Processing :D.
Sudah siap membuat
project,langsung aja kita mulai coding awal :
1.
Pertama kita buat project java Class dan beri
nama “CostomFilter”.
package
imageviewer, lalu ketikan code tersebut didalamnya.tentunya jangan Copas ya
sob,masak calon programer males Ngetik Skript? :D.
Maksud
Code dibawah ini adalah untuk memasukan image kedalam Canvas yaitu kedalam
lembar kerja.
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
*
*
@author mohamed
*/
public class CustomFilter extends JFrame{
/** Creates a new instance of CustomFilter */
public CustomFilter(BufferedImage buffImage) {
setTitle("Custom Filter");
setSize(400,200);
setLocation(250,250);
Orginal=buffImage;
Container cp=getContentPane();
cp.setLayout(new FlowLayout());
myPanel.setLayout(new GridLayout(5,5));
for(int i=0;i<5;i++)
for(int j=0;j<5;j++) {
myfilds[i][j]=new JTextField("0.08",5);
myPanel.add(myfilds[i][j]);
}
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int count=0;
float foa;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++) {
customfil[count] =Float.parseFloat(myfilds[i][j].getText());
count++;
}
int w =Orginal.getWidth();
int h = Orginal.getHeight();
biop = new ConvolveOp(new
Kernel(dim[0][0],dim[0][1],customfil));
BufferedImage bi = new
BufferedImage(w,h,Orginal.TYPE_INT_RGB);
biop.filter(Orginal,bi);
new
ShowFrame(bi,"Custom Filter");
}
});
Cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
cp.add(myPanel);
cp.add(ok);
cp.add(Cancel);
}
private JTextField [][] myfilds=new JTextField[5][5];
private JPanel myPanel=new JPanel();
private JButton ok=new JButton("OK");
private JButton Cancel=new JButton("Cancel");
private float[] customfil
= new float[25];
private BufferedImageOp biop;
private BufferedImage Orginal;
private int dim[][] = {{5,5}};
}
2.
Terus buat Java Class lagi beri nama “EdgeDetector”
/*
* * Please Visit us at
www.codemiles.com *
* This Program was Developed by
www.codemiles.com forums Team
* * Please Don't Remove This
Comment *
*/
package imageviewer;
/**
*
* @author mahmoud
*/
import java.awt.*;
import java.awt.image.*;
import java.util.BitSet;
import javax.swing.ImageIcon;
public class EdgeDetector extends
Component {
public EdgeDetector(int hi,int wd,Image
image) {
threshold1 = 50;
threshold2 = 230;
width=wd;
height=hi;
setThreshold(128);
setWidGaussianKernel(15);
sourceImage = image;
try {
process();
} catch (EdgeDetectorException ex) {
ex.printStackTrace();
}
}
public void process() throws
EdgeDetectorException {
if (threshold < 0 || threshold >
255)
throw new
EdgeDetectorException("The value of the threshold is out of its valid
range.");
if (widGaussianKernel < 3 ||
widGaussianKernel > 40)
throw new
EdgeDetectorException("The value of the widGaussianKernel is out of its
valid range.");
width = sourceImage.getWidth(this);
height = sourceImage.getHeight(this);
picsize = width * height;
data = new int[picsize];
magnitude = new int[picsize];
orientation = new int[picsize];
float f = 1.0F;
canny_core(f, widGaussianKernel);
thresholding_tracker(threshold1,
threshold2);
for (int i = 0; i < picsize; i++)
if (data[i] > threshold)
data[i] = 0xff000000;
else
data[i] = -1;
edgeImage = pixels2image(data);
/*int w = edgeImage.getWidth(null);
int h = edgeImage.getHeight(null);
bi = new
BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics2D
g2=(Graphics2D)edgeImage.getGraphics();*/
data = null;
magnitude = null;
orientation = null;
}
private void canny_core(float f, int i) {
boolean flag = false;
boolean flag1 = false;
derivative_mag = new int[picsize];
float af4[] = new float[i];
float af5[] = new float[i];
float af6[] = new float[i];
data = image2pixels(sourceImage);
int k4 = 0;
do {
if (k4 >= i)
break;
float f1 = gaussian(k4, f);
if (f1 <= 0.005F && k4
>= 2)
break;
float f2 = gaussian((float) k4 - 0.5F,
f);
float f3 = gaussian((float) k4 +
0.5F, f);
float f4 = gaussian(k4, f * 0.5F);
af4[k4] = (f1 + f2 + f3) / 3F /
(6.283185F * f * f);
af5[k4] = f3 - f2;
af6[k4] = 1.6F * f4 - f1;
k4++;
} while (true);
int j = k4;
float af[] = new float[picsize];
float af1[] = new float[picsize];
int j1 = width - (j - 1);
int l = width * (j - 1);
int i1 = width * (height - (j - 1));
for (int l4 = j - 1; l4 < j1; l4++)
{
for (int l5 = l; l5 < i1; l5 +=
width) {
int k1 = l4 + l5;
float f8 = (float) data[k1] *
af4[0];
float f10 = f8;
int l6 = 1;
int k7 = k1 - width;
for (int i8 = k1 + width; l6
< j; i8 += width) {
f8 += af4[l6] * (float)
(data[k7] + data[i8]);
f10 += af4[l6] * (float)
(data[k1 - l6] + data[k1 + l6]);
l6++;
k7 -= width;
}
af[k1] = f8;
af1[k1] = f10;
}
}
float af2[] = new float[picsize];
for (int i5 = j - 1; i5 < j1; i5++)
{
for (int i6 = l; i6 < i1; i6 +=
width) {
float f9 = 0.0F;
int l1 = i5 + i6;
for (int i7 = 1; i7 < j;
i7++)
f9 += af5[i7] * (af[l1 - i7]
- af[l1 + i7]);
af2[l1] = f9;
}
}
af = null;
float af3[] = new float[picsize];
for (int j5 = k4; j5 < width - k4;
j5++) {
for (int j6 = l; j6 < i1; j6 +=
width) {
float f11 = 0.0F;
int i2 = j5 + j6;
int j7 = 1;
for (int l7 = width; j7 < j;
l7 += width) {
f11 += af5[j7] * (af1[i2 -
l7] - af1[i2 + l7]);
j7++;
}
af3[i2] = f11;
}
}
af1 = null;
j1 = width - j;
l = width * j;
i1 = width * (height - j);
for (int k5 = j; k5 < j1; k5++) {
for (int k6 = l; k6 < i1; k6 +=
width) {
int j2 = k5 + k6;
int k2 = j2 - width;
int l2 = j2 + width;
int i3 = j2 - 1;
int j3 = j2 + 1;
int k3 = k2 - 1;
int l3 = k2 + 1;
int i4 = l2 - 1;
int j4 = l2 + 1;
float f6 = af2[j2];
float f7 = af3[j2];
float f12 = hypotenuse(f6, f7);
int k = (int) ((double) f12 *
20D);
derivative_mag[j2] = k >=
256 ? 255 : k;
float f13 = hypotenuse(af2[k2],
af3[k2]);
float f14 = hypotenuse(af2[l2],
af3[l2]);
float f15 = hypotenuse(af2[i3],
af3[i3]);
float f16 = hypotenuse(af2[j3],
af3[j3]);
float f18 = hypotenuse(af2[l3],
af3[l3]);
float f20 = hypotenuse(af2[j4],
af3[j4]);
float f19 = hypotenuse(af2[i4],
af3[i4]);
float f17 = hypotenuse(af2[k3],
af3[k3]);
float f5;
if (f6 * f7 <= (float) 0
? Math.abs(f6) >=
Math.abs(f7)
? (f5 = Math.abs(f6 * f12))
>= Math.abs(f7 * f18
- (f6 + f7) * f16)
&& f5
> Math.abs(f7 * f19
- (f6 + f7) * f15) : (
f5 = Math.abs(f7 *
f12))
>= Math.abs(f6 * f18 - (f7 + f6)
* f13)
&& f5
> Math.abs(f6 * f19
- (f7 + f6) * f14) : Math.abs(f6)
>= Math.abs(f7)
? (f5 = Math.abs(f6 *
f12))
>= Math.abs(f7 * f20 +
(f6 - f7) * f16)
&& f5
> Math.abs(f7 * f17
+ (f6 - f7) * f15) : (
f5 = Math.abs(f7 *
f12))
>= Math.abs(f6 * f20
+ (f7 - f6) * f14)
&& f5 >
Math.abs(f6 * f17 + (f7 - f6) * f13)) {
magnitude[j2] =
derivative_mag[j2];
orientation[j2] = (int)
(Math.atan2(f7, f6) * (double) 40F);
}
}
}
derivative_mag = null;
af2 = null;
af3 = null;
}
private float hypotenuse(float f, float f1)
{
if (f == 0.0F && f1 == 0.0F)
return 0.0F;
else
return (float) Math.sqrt(f * f + f1
* f1);
}
private float gaussian(float f, float f1) {
return (float) Math.exp((-f * f) /
((float) 2 * f1 * f1));
}
private void thresholding_tracker(int i,
int j) {
for (int k = 0; k < picsize; k++)
data[k] = 0;
for (int l = 0; l < width; l++) {
for (int i1 = 0; i1 < height;
i1++)
if (magnitude[l + width * i1]
>= i)
follow(l, i1, j);
}
}
private boolean follow(int i, int j, int k)
{
int j1 = i + 1;
int k1 = i - 1;
int l1 = j + 1;
int i2 = j - 1;
int j2 = i + j * width;
if (l1 >= height)
l1 = height - 1;
if (i2 < 0)
i2 = 0;
if (j1 >= width)
j1 = width - 1;
if (k1 < 0)
k1 = 0;
if (data[j2] == 0) {
data[j2] = magnitude[j2];
boolean flag = false;
int l = k1;
do {
if (l > j1)
break;
int i1 = i2;
do {
if (i1 > l1)
break;
int k2 = l + i1 * width;
if ((i1 != j || l != i)
&& magnitude[k2]
>= k
&&
follow(l, i1, k)) {
flag = true;
break;
}
i1++;
} while (true);
if (!flag)
break;
l++;
}
while (true);
return true;
} else {
return false;
}
}
private Image pixels2image(int ai[]) {
MemoryImageSource memoryimagesource =
new MemoryImageSource(
width,
height,
ColorModel.getRGBdefault(),
ai,
0,
width);
return
Toolkit.getDefaultToolkit().createImage(memoryimagesource);
}
private int[] image2pixels(Image image) {
int ai[] = new int[picsize];
PixelGrabber pixelgrabber =
new PixelGrabber(image, 0, 0,
width, height, ai, 0, width);
try {
pixelgrabber.grabPixels();
} catch (InterruptedException
interruptedexception) {
interruptedexception.printStackTrace();
}
boolean flag = false;
int k1 = 0;
do {
if (k1 >= 16)
break;
int i = (ai[k1] & 0xff0000)
>> 16;
int k = (ai[k1] & 0xff00)
>> 8;
int i1 = ai[k1] & 0xff;
if (i != k || k != i1) {
flag = true;
break;
}
k1++;
} while (true);
if (flag) {
for (int l1 = 0; l1 < picsize;
l1++) {
int j = (ai[l1] & 0xff0000)
>> 16;
int l = (ai[l1] & 0xff00)
>> 8;
int j1 = ai[l1] & 0xff;
ai[l1] =
(int)
(0.29799999999999999D * (double) j
+ 0.58599999999999997D
* (double) l
+ 0.113D * (double)
j1);
}
} else {
for (int i2 = 0; i2 < picsize;
i2++)
ai[i2] = ai[i2] & 0xff;
}
return ai;
}
public void setSourceImage(Image image) {
sourceImage = image;
}
public Image getEdgeImage() {
return edgeImage;
}
public void setThreshold(int i) {
threshold = i;
}
public void setWidGaussianKernel(int i) {
widGaussianKernel = i;
}
final float ORIENT_SCALE = 40F;
private int height;
private int width;
private int picsize;
private int data[];
private int derivative_mag[];
private int magnitude[];
private int orientation[];
private Image sourceImage;
private Image edgeImage;
private int threshold1;
private int threshold2;
private int threshold;
private int widGaussianKernel;
private static ShowFrame myFrame;
}
class EdgeDetectorException
extends Exception {
public EdgeDetectorException() {
//do something?
}
public EdgeDetectorException(String s) {
super(s);
}
}
/*
* * Please Visit us at
www.codemiles.com *
* This Program was Developed by
www.codemiles.com forums Team
* * Please Don't Remove This
Comment *
*/
3. Langkah
ke tiga kita buat java Class lagi dan berinama “EnhancementPanel”
/*
* * Please Visit us at www.codemiles.com *
* This Program was Developed by
www.codemiles.com forums Team
* * Please Don't Remove This
Comment *
*/
package imageviewer;
import
EnhancementOpr.Binirization;
import
imageviewer.NoiseFilters.NoiseFilter;
import java.awt.FlowLayout;
import
java.awt.event.ActionEvent;
import
java.awt.event.ActionListener;
import
java.awt.image.BufferedImage;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
/**
*
* @author Mohammed
*/
public class EnhancementPanel
extends JPanel {
/** Creates a new instance of
EnhancementPanel */
public EnhancementPanel(BufferedImage
newimg) {
img=newimg;
for(int j=0; j<EnhOper.length; j++)
EnCombo.addItem(EnhOper[j]);
EnCombo.addActionListener(new
ActionListener() {
public void
actionPerformed(ActionEvent e) {
EnhIndex=EnCombo.getSelectedIndex();
int w = img.getWidth();
int h = img.getHeight();
threshold=threSlid.getValue();
System.out.println("ThreShold" + threshold);
BufferedImage bi = new
BufferedImage(w,h,BufferedImage.TYPE_3BYTE_BGR);
myBin=new Binirization(img);
if(EnhIndex==0){
myBin.setThreshold(threshold);
myBin.DoBinirization();
bi=myBin.getImg();
}else
{
bi=img;
}
// bi=myNoise.filter(img, bi);
new
ShowFrame(bi,EnhOper[EnhIndex]);
}
});
setLayout(new FlowLayout());
add(EnCombo);
add(thresholdLab);
add(threSlid);
}
public void setImg(BufferedImage img) {
temp=this.img = img;
}
private JComboBox EnCombo = new
JComboBox();
private int EnhIndex=0;
private BufferedImage img;
private BufferedImage temp;
private JSlider threSlid = new
JSlider(0,255,150);
private JLabel thresholdLab = new
JLabel("ThreShold :");
private static String
EnhOper[]={"Binirization","Segmentation"};
private int threshold;
private Binirization myBin;
private NoiseFilter myNoise=new
NoiseFilter();
}
/*
* * Please Visit us at
www.codemiles.com *
* This Program was Developed by
www.codemiles.com forums Team
* * Please Don't Remove This Comment *
*/
Demikian tutorial Season Pertama tentang Tutorial Deteksi Warna RGB Image Processing Java,Untuk Langkah selanjutnya Silahkan Klik Link ##**## :
ConversionConversion EmoticonEmoticon