Sei sulla pagina 1di 20

YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

LATIHAN PRATIKUM

1. ARITMATIKA OPERATION

➢ Sourcecode

averageDenoisingToolStripMenuItem
private void averageDenoisingToolStripMenuItem_Click(object sender, EventArgs
e)
{
FolderBrowserDialog folderDlg = new FolderBrowserDialog();
folderDlg.ShowNewFolderButton = true;
if (folderDlg.ShowDialog() == DialogResult.OK)
{
Environment.SpecialFolder root = folderDlg.RootFolder;
}
List<Image> pictureArray = new List<Image>();
foreach (string item in
Directory.GetFiles(folderDlg.SelectedPath, "*.jpg",
SearchOption.AllDirectories))
{
Image _image = Image.FromFile(item);
pictureArray.Add(_image);
}
pbInput.Image = pictureArray[0];
Bitmap b = new Bitmap((Bitmap)this.pbInput.Image);
Bitmap c = new Bitmap((Bitmap)this.pbInput.Image);
ProgressBar1.Visible = true;
toolStripStatusLabel2.Text = "Res. Citra: " + pbInput.Image.Width
+ " x " + pbInput.Image.Height;
int R, G, B, newR, newG, newB;
int jumGambar = 50;
for (int i = 0; i < b.Width; i++)
{
for (int j = 0; j < b.Height; j++)
{
R = 0;
G = 0;
B = 0;
for (int k = 0; k < jumGambar - 1; k++)
{
b = (Bitmap)pictureArray[k];
Color c1 = b.GetPixel(i, j);
R += c1.R;
G += c1.G;
B += c1.B;
}
newR = R / jumGambar;
newG = G / jumGambar;
newB = B / jumGambar;
c.SetPixel(i, j, Color.FromArgb(newR, newG, newB));
}
ProgressBar1.Value = Convert.ToInt16(100 * (i + 1) /
c.Width);
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

}
ProgressBar1.Visible = false;
this.pbOutput.Image = c;

➢ Hasil
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

2. WARNA TERDEKAT

➢ Sourcecode

private static double warnaTerdekat(int pValueR, int pValueG, int pValueB)


{
double minDistance = 255 * 255 + 255 * 255 + 255 * 255;
int palColor, rDiff, gDiff, bDiff;
double pValueR1 = 0;
double distance;

//set warna pallete: hitam, merah, hijau, kuning, biru, cyan,


magenta, putih
int[,] palletteColor = new int[,] { { 0, 0, 0 }, {255, 0, 0}, {0,
255, 0},
{255, 255, 0}, {0, 0, 255}, {0,255,255}, {255,0,255}, {255,
255, 255} };
for (palColor = 0; palColor <= palletteColor.GetLength(0) - 1;
palColor++)
{
rDiff = pValueR - palletteColor[palColor, 0];
gDiff = pValueG - palletteColor[palColor, 1];
bDiff = pValueB - palletteColor[palColor, 2];
distance = rDiff * rDiff + gDiff * gDiff + bDiff * bDiff;
if (distance < minDistance)
{
minDistance = distance;
pValueR1 = palColor;
}
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

}
return pValueR1;

Nearest8ColorToolStripMenuItem

private void nearest8ColorToolStripMenuItem_Click(object sender, EventArgs e)


{
if (pbInput.Image == null)
MessageBox.Show("Tidak ada citra yang akan diolah");
else
{
double baru;
int[,] palletteColor = new int[,] { { 0, 0, 0 }, {255, 0, 0},
{0, 255, 0},
{255, 255, 0}, {0, 0, 255}, {0,255,255}, {255,0,255}, {255,
255, 255} };
Bitmap b = new Bitmap((Bitmap)this.pbInput.Image);
this.pbOutput.Image = b;
ProgressBar1.Visible = true;
for (int i = 0; i < b.Width; i++)
{
for (int j = 0; j < b.Height; j++)
{
Color c1 = b.GetPixel(i, j);
baru = warnaTerdekat(c1.R, c1.G, c1.B);
b.SetPixel(i, j,
Color.FromArgb(palletteColor[Convert.ToInt16(baru), 0],
palletteColor[Convert.ToInt16(baru), 1],
palletteColor[Convert.ToInt16(baru), 2]));
}
ProgressBar1.Value = Convert.ToInt16(100 * (i + 1) /
b.Width);
}
ProgressBar1.Visible = false;
this.pbOutput.Image = b;
}

➢ Hasil
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

3. ERROR DIFFUSION

➢ Soucecode

private static int truncateInt(int x)


{
if (x > 255) x = 255;
else if (x < 0) x = 0;
return x;
}

private void errorDiffusionToolStripMenuItem_Click(object sender, EventArgs


e)
{
if (pbInput.Image == null)
MessageBox.Show("Tidak ada citra yang akan diolah");
else
{
int[,] paletteColor = {{ 0, 0, 0 }, {255, 0, 0}, {0, 255, 0},
{255, 255, 0}, {0, 0, 255}, {0,255,255}, {255,0,255}, {255,
255, 255}};
Bitmap b = new Bitmap((Bitmap)this.pbInput.Image);
this.pbOutput.Image = b;
int merah, hijau, biru;
double baru, errorR, errorG, errorB;
ProgressBar1.Visible = true;
for (int i = 0; i <= b.Width - 2; i++)
{
for (int j = 0; j <= b.Height - 2; j++)
{
merah = b.GetPixel(i, j).R;
hijau = b.GetPixel(i, j).G;
biru = b.GetPixel(i, j).B;

baru = warnaTerdekat(merah, hijau, biru);

errorR = merah - paletteColor[Convert.ToInt16(baru),


0];
errorG = hijau - paletteColor[Convert.ToInt16(baru),
1];
errorB = biru - paletteColor[Convert.ToInt16(baru),
2];

if (i == 0)
{
b.SetPixel(i + 1, j,
Color.FromArgb(truncateInt(b.GetPixel(i + 1, j).R + 7 / 16 *
Convert.ToInt32(errorR)),
truncateInt(b.GetPixel(i + 1, j).G + 7 / 16 *
Convert.ToInt32(errorG)),
truncateInt(b.GetPixel(i + 1, j).B + 7 / 16 *
Convert.ToInt32(errorB))));
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

b.SetPixel(i, j + 1,
Color.FromArgb(truncateInt(b.GetPixel(i, j + 1).R + 5 / 16 *
Convert.ToInt32(errorR)),
truncateInt(b.GetPixel(i, j + 1).G + 5 / 16 *
Convert.ToInt32(errorG)),
truncateInt(b.GetPixel(i, j + 1).B + 5 / 16 *
Convert.ToInt32(errorB))));
b.SetPixel(i + 1, j + 1,
Color.FromArgb(truncateInt(b.GetPixel(i + 1, j + 1).R + 1 / 16 *
Convert.ToInt32(errorR)),
truncateInt(b.GetPixel(i + 1, j + 1).G + 1 /
16 * Convert.ToInt32(errorG)),
truncateInt(b.GetPixel(i + 1, j + 1).B + 1 /
16 * Convert.ToInt32(errorB))));
}
else
{
b.SetPixel(i + 1, j,
Color.FromArgb(truncateInt(b.GetPixel(i + 1, j).R + 7 / 16 *
Convert.ToInt32(errorR)),
truncateInt(b.GetPixel(i + 1, j).G + 7 / 16 *
Convert.ToInt32(errorG)),
truncateInt(b.GetPixel(i + 1, j).B + 7 / 16 *
Convert.ToInt32(errorB))));
b.SetPixel(i - 1, j + 1,
Color.FromArgb(truncateInt(b.GetPixel(i - 1, j + 1).R + 3 / 16 *
Convert.ToInt32(errorR)),
truncateInt(b.GetPixel(i - 1, j + 1).G + 3 /
16 * Convert.ToInt32(errorG)),
truncateInt(b.GetPixel(i - 1, j + 1).B + 3 /
16 * Convert.ToInt32(errorB))));
b.SetPixel(i, j + 1,
Color.FromArgb(truncateInt(b.GetPixel(i, j + 1).R + 5 / 16 *
Convert.ToInt32(errorR)),
truncateInt(b.GetPixel(i, j + 1).G + 5 / 16 *
Convert.ToInt32(errorG)),
truncateInt(b.GetPixel(i, j + 1).B + 5 / 16 *
Convert.ToInt32(errorB))));
b.SetPixel(i + 1, j + 1,
Color.FromArgb(truncateInt(b.GetPixel(i + 1, j + 1).R + 1 / 16 *
Convert.ToInt32(errorR)),
truncateInt(b.GetPixel(i + 1, j + 1).G + 1 /
16 * Convert.ToInt32(errorG)),
truncateInt(b.GetPixel(i + 1, j + 1).B + 1 /
16 * Convert.ToInt32(errorB))));

}
}
ProgressBar1.Value = Convert.ToInt16(100 * (i + 1) /
b.Width);

}
ProgressBar1.Visible = false;
this.pbOutput.Refresh();
}
}
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

➢ Hasil
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

PRATIKUM

HISTOGRAM CITRA WARNA

➢ Sourcecode

InputToolStripMenuItem

private void inputToolStripMenuItem_Click(object sender, EventArgs e)


{
if (pbInput.Image == null)
MessageBox.Show("Tidak ada citra yang akan diolah");
else
{
//Data histogram disimpan kedalam Dictionary bertipe data
Byte untuk intensitas pixel dan bertipe Double untuk nilai histogram tiap
pixel
Dictionary<Byte, Double> histoR = new Dictionary<Byte,
Double>();
Dictionary<Byte, Double> histoG = new Dictionary<Byte,
Double>();
Dictionary<Byte, Double> histoB = new Dictionary<Byte,
Double>();
//Variabel b (Bitmap) digunakan untuk menyimpan nilai citra
masukan
Bitmap b = new Bitmap((Bitmap)this.pbInput.Image);
//Form5 adalah form untuk chart Histogram Grayscale
//Form6 adalah form untuk chart Histogram RGB
GrayscaleHistogram frm5 = new GrayscaleHistogram();
RGBHistogram frm6 = new RGBHistogram();
//Nilai awal pixel 0 - 255 diset bernilai 0
for (int counter = 0; counter <= 255; counter++)
{
histoR[(Byte)counter] = 0.0;
histoG[(Byte)counter] = 0.0;
histoB[(Byte)counter] = 0.0;
}
//Untuk tiap baris dan kolom citra, nilai histogram
ditambahkan
for (int i = 0; i <= 255; i++)
{
for (int j = 0; j <= 255; j++)
{
Color c1 = b.GetPixel(i, j);
//jika pada baris i kolom j, pixel bernilai n, maka
nilai n pada dictionary ditambah 1
if (histoR.ContainsKey(c1.R))
{
histoR[c1.R] += 1.0;
}
if (histoG.ContainsKey(c1.G))
{
histoG[c1.G] += 1.0;
}
if (histoB.ContainsKey(c1.R))
{
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

histoB[c1.R] += 1.0;
}
}
ProgressBar1.Value = Convert.ToInt16(100 * (i + 1) /
b.Width);
}
ProgressBar1.Visible = false;
//jika histogram R == G, maka kemungkinan besar citra
grayscale
//jika grayscale maka form5 yang ditampilkan
if (histoR.Count == histoG.Count &&
!histoR.Except(histoG).Any())
{
//Variabel intensitas pixel pada dictionary dimapping ke
dalam List kunci1 bertipe Byte
List<Byte> kunci1 = new List<Byte>(histoR.Keys.ToList());
frm5.Show();
//tiga baris dibawah ini sengaja diset di code, agar tahu
setting propertiesnya
frm5.chart1.Series["Series1"].Color = Color.Gray;

frm5.chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled = false;

frm5.chart1.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled = false;
//Untuk tiap data dalam List kunci1
foreach (Byte key in kunci1)
{
//nilai histogram dinormalisasi
histoR[key] = histoR[key] / (b.Width * b.Height);
frm5.chart1.Series["Series1"].Points.AddXY(key,
histoR[key]);
}
}
else
{
//lakukan proses histogram citra warna
List<Byte> kunci1 = new List<Byte>(histoR.Keys.ToList());
List<Byte> kunci2 = new List<Byte>(histoG.Keys.ToList());
List<Byte> kunci3 = new List<Byte>(histoB.Keys.ToList());
kunci1.Sort();
kunci2.Sort();
kunci3.Sort();
frm6.Show();
foreach (Byte key in kunci1)
{
histoR[key] = histoR[key] / (b.Width * b.Height);
frm6.chart1.Series["Series1"].Points.AddXY(key,
histoR[key]);
}
foreach (Byte key in kunci2)
{
histoG[key] = histoG[key] / (b.Width * b.Height);
frm6.chart2.Series["Series1"].Points.AddXY(key,
histoG[key]);
}
foreach (Byte key in kunci3)
{
histoB[key] = histoB[key] / (b.Width * b.Height);
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

frm6.chart3.Series["Series1"].Points.AddXY(key,
histoB[key]);
}
}
}
}

outputToolStripMenuItem

private void outputToolStripMenuItem_Click(object sender, EventArgs e)


{
if (pbOutput.Image == null)
MessageBox.Show("Tidak ada citra yang akan diolah");
else
{
Dictionary<int, double> HistoR = new Dictionary<int,
double>();
Dictionary<int, double> HistoG = new Dictionary<int,
double>();
Dictionary<int, double> HistoB = new Dictionary<int,
double>();

Bitmap b = new Bitmap((Bitmap)this.pbOutput.Image);


GrayscaleHistogram histogramGrayscale = new
GrayscaleHistogram();
RGBHistogram histogramColor = new RGBHistogram();

for (int h = 0; h <= 255; h++)


{
HistoR.Add(h, 0);
HistoG.Add(h, 0);
HistoB.Add(h, 0);
}
for (int i = 0; i < b.Width; i++)
{
for (int j = 0; j < b.Height; j++)
{
Color c1 = b.GetPixel(i, j); //jika pada baris i
kolom j, pixel bernilai n, maka nilai n pada dictionary ditambah 1

for (int k = 0; k <= 255; k++)


{
if (c1.G == k)
{
HistoG[k] = HistoG[k] + 1;
}
if (c1.R == k)
{
HistoR[k] = HistoR[k] + 1;
}
if (c1.B == k)
{
HistoB[k] = HistoB[k] + 1;
}
}
}
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

ProgressBar1.Value = Convert.ToInt16(100 * (i + 1) /
b.Width);
}
ProgressBar1.Visible = false;

histogramGrayscale.chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramGrayscale.chart1.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

histogramColor.chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramColor.chart1.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

histogramColor.chart2.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramColor.chart2.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

histogramColor.chart3.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramColor.chart3.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

if (HistoR.Count == HistoG.Count &&


!HistoR.Except(HistoG).Any())
{
histogramGrayscale.chart1.Series["Series1"].Color =
Color.Gray;

histogramGrayscale.chart1.Series[0].Points.DataBindXY(HistoR.Keys,
HistoR.Values);
histogramGrayscale.ShowDialog();
}
else
{
histogramColor.chart1.Series["Series1"].Color =
Color.Red;
histogramColor.chart2.Series["Series1"].Color =
Color.Green;
histogramColor.chart3.Series["Series1"].Color =
Color.Blue;

histogramColor.chart1.Series[0].Points.DataBindXY(HistoR.Keys,
HistoR.Values);

histogramColor.chart2.Series[0].Points.DataBindXY(HistoG.Keys,
HistoG.Values);

histogramColor.chart3.Series[0].Points.DataBindXY(HistoB.Keys,
HistoB.Values);
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

histogramColor.ShowDialog();
}
}
}

Input

private void input()


{
if (pbInput.Image == null)
MessageBox.Show("Tidak ada citra yang akan diolah");
else
{
//Data histogram disimpan kedalam Dictionary bertipe data
Byte untuk intensitas pixel dan bertipe Double untuk nilai histogram tiap
pixel
Dictionary<Byte, Double> histoR = new Dictionary<Byte,
Double>();
Dictionary<Byte, Double> histoG = new Dictionary<Byte,
Double>();
Dictionary<Byte, Double> histoB = new Dictionary<Byte,
Double>();
//Variabel b (Bitmap) digunakan untuk menyimpan nilai citra
masukan
Bitmap b = new Bitmap((Bitmap)this.pbInput.Image);
//Form5 adalah form untuk chart Histogram Grayscale
//Form6 adalah form untuk chart Histogram RGB
GrayscaleHistogram frm5 = new GrayscaleHistogram();
RGBHistogram frm6 = new RGBHistogram();
//Nilai awal pixel 0 - 255 diset bernilai 0
for (int counter = 0; counter <= 255; counter++)
{
histoR[(Byte)counter] = 0.0;
histoG[(Byte)counter] = 0.0;
histoB[(Byte)counter] = 0.0;
}
//Untuk tiap baris dan kolom citra, nilai histogram
ditambahkan
for (int i = 0; i <= 255; i++)
{
for (int j = 0; j <= 255; j++)
{
Color c1 = b.GetPixel(i, j);
//jika pada baris i kolom j, pixel bernilai n, maka
nilai n pada dictionary ditambah 1
if (histoR.ContainsKey(c1.R))
{
histoR[c1.R] += 1.0;
}
if (histoG.ContainsKey(c1.G))
{
histoG[c1.G] += 1.0;
}
if (histoB.ContainsKey(c1.R))
{
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

histoB[c1.R] += 1.0;
}
}
ProgressBar1.Value = Convert.ToInt16(100 * (i + 1) /
b.Width);
}
ProgressBar1.Visible = false;
//jika histogram R == G, maka kemungkinan besar citra
grayscale
//jika grayscale maka form5 yang ditampilkan
if (histoR.Count == histoG.Count &&
!histoR.Except(histoG).Any())
{
//Variabel intensitas pixel pada dictionary dimapping ke
dalam List kunci1 bertipe Byte
List<Byte> kunci1 = new List<Byte>(histoR.Keys.ToList());
frm5.Show();
//tiga baris dibawah ini sengaja diset di code, agar tahu
setting propertiesnya
frm5.chart1.Series["Series1"].Color = Color.Gray;

frm5.chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled = false;

frm5.chart1.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled = false;
//Untuk tiap data dalam List kunci1
foreach (Byte key in kunci1)
{
//nilai histogram dinormalisasi
histoR[key] = histoR[key] / (b.Width * b.Height);
frm5.chart1.Series["Series1"].Points.AddXY(key,
histoR[key]);
}
}
else
{
//lakukan proses histogram citra warna
List<Byte> kunci1 = new List<Byte>(histoR.Keys.ToList());
List<Byte> kunci2 = new List<Byte>(histoG.Keys.ToList());
List<Byte> kunci3 = new List<Byte>(histoB.Keys.ToList());
kunci1.Sort();
kunci2.Sort();
kunci3.Sort();
frm6.Show();
foreach (Byte key in kunci1)
{
histoR[key] = histoR[key] / (b.Width * b.Height);
frm6.chart1.Series["Series1"].Points.AddXY(key,
histoR[key]);
}
foreach (Byte key in kunci2)
{
histoG[key] = histoG[key] / (b.Width * b.Height);
frm6.chart2.Series["Series1"].Points.AddXY(key,
histoG[key]);
}
foreach (Byte key in kunci3)
{
histoB[key] = histoB[key] / (b.Width * b.Height);
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

frm6.chart3.Series["Series1"].Points.AddXY(key,
histoB[key]);
}
}
}
}

Output

private void output()


{
if (pbOutput.Image == null)
MessageBox.Show("Tidak ada citra yang akan diolah");
else
{
Dictionary<int, double> HistoR = new Dictionary<int,
double>();
Dictionary<int, double> HistoG = new Dictionary<int,
double>();
Dictionary<int, double> HistoB = new Dictionary<int,
double>();

Bitmap b = new Bitmap((Bitmap)this.pbOutput.Image);


GrayscaleHistogram histogramGrayscale = new
GrayscaleHistogram();
RGBHistogram histogramColor = new RGBHistogram();

for (int h = 0; h <= 255; h++)


{
HistoR.Add(h, 0);
HistoG.Add(h, 0);
HistoB.Add(h, 0);
}
for (int i = 0; i < b.Width; i++)
{
for (int j = 0; j < b.Height; j++)
{
Color c1 = b.GetPixel(i, j); //jika pada baris i
kolom j, pixel bernilai n, maka nilai n pada dictionary ditambah 1

for (int k = 0; k <= 255; k++)


{
if (c1.G == k)
{
HistoG[k] = HistoG[k] + 1;
}
if (c1.R == k)
{
HistoR[k] = HistoR[k] + 1;
}
if (c1.B == k)
{
HistoB[k] = HistoB[k] + 1;
}
}
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

}
ProgressBar1.Value = Convert.ToInt16(100 * (i + 1) /
b.Width);
}
ProgressBar1.Visible = false;

histogramGrayscale.chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramGrayscale.chart1.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

histogramColor.chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramColor.chart1.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

histogramColor.chart2.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramColor.chart2.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

histogramColor.chart3.ChartAreas["ChartArea1"].AxisX.LabelStyle.Enabled =
false;

histogramColor.chart3.ChartAreas["ChartArea1"].AxisY.LabelStyle.Enabled =
false;

if (HistoR.Count == HistoG.Count &&


!HistoR.Except(HistoG).Any())
{
histogramGrayscale.chart1.Series["Series1"].Color =
Color.Gray;

histogramGrayscale.chart1.Series[0].Points.DataBindXY(HistoR.Keys,
HistoR.Values);
histogramGrayscale.ShowDialog();
}
else
{
histogramColor.chart1.Series["Series1"].Color =
Color.Red;
histogramColor.chart2.Series["Series1"].Color =
Color.Green;
histogramColor.chart3.Series["Series1"].Color =
Color.Blue;

histogramColor.chart1.Series[0].Points.DataBindXY(HistoR.Keys,
HistoR.Values);

histogramColor.chart2.Series[0].Points.DataBindXY(HistoG.Keys,
HistoG.Values);
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

histogramColor.chart3.Series[0].Points.DataBindXY(HistoB.Keys,
HistoB.Values);
histogramColor.ShowDialog();
}
}
}

inputOutputToolStripMenuItem

private void inputOutputToolStripMenuItem_Click(object sender, EventArgs e)


{
input();
output();
}

➢ Hasil
Hasil histogram -> input
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

Hasil histogram -> output


YASMINI_1641720089 PRATIKUM 6_PCD TI 4H
YASMINI_1641720089 PRATIKUM 6_PCD TI 4H

Hasil histogram -> Input Output

Potrebbero piacerti anche