Modul PCD
Modul PCD
Modul dan Jobsheet Praktikum Pengolahan Citra Digital I (For Instructor) 2018/2019 ini disusun
sebagai pendukung kegiatan praktikum matakuliah Pengolahan Citra Digital bagi Asisten
Laboratorium dengan mengikuti silabus/RPS dari matakuliah. Praktikum ini menggunakan library
OPenCV dan Python 3. Modul praktikum ini disusun oleh dosen matakuliah dan diperiksa kembali
bersama dengan para asisten Lab. Berikut ini adalah Penanggungjawab dan Asisten Praktikum:
i
DAFTAR ISI
ii
PRAKTIKUM PENGOLAHAN CITRA DIGITAL
Pada kegiatan praktek Pengolahan Citra Digital ini, mahasiswa akan melakukan praktikum dari mulai
mendesain dan mengimplementasikan algoritma pengolahan citra digital menggunakan bahasa
pemrograman Python dengan didukung oleh library computer vision ‘opencv2’ dan library untuk
tampilan antarmuka ‘PyQt5’.
Berikut ini adalah proses persiapan kegiatan praktikum mulai dari proses instalasi Python, open
source software untuk editor pemrograman menggunakan PyCharm dan modul lib lainnya.
1. INSTALASI PYTHON
Tahapan yang dapat dilakukan oleh mahasiswa untuk menginstal Python adalah sebagai berikut:
1. Downaload Python di https://www.python.org/downloads/
1
2. INSTALASI PYCHARM
Tahapan yang dapat dilakukan oleh mahasiswa untuk menginstal editor tool untuk memudahkan
melakukan proses coding dengan cara sebagai berikut:
1. Download di https://www.jetbrains.com/pycharm/download/#section=windows
2
Gambar 3. Download Windows Binary Python Extension OpenCv2
3. Dengan cara yang sama dengan langkah dua, download wheel numpy, scipy, matplotlib,
pillow
4. Masuk ke tempat python di instal dan simpan semua wheel di folder Scripts
5. Selanjutnya setelah mendownload keseluruhan library yang dibutuhkan, dilanjutkan instalasi
dengan cara klik pada ikon Start, ketikkan cmd (command prompt di windows)
6. Masuk ke direktori C:\Python36\Scripts dengan cara ketikkan cd C://Python36/Scripts
7. Instal opencv dengan cara ketikkan ‘pip install (nama wheel dan ekstension)’ >>enter, untuk
lebih memudahkan sebaiknya copy nama filenya seperti pada Gambar 5.
3
Gambar 5. Copy nama file Wheel
8. Lakukan cara yang sama seperti pada langkah 7 untuk library numpy, scipy, matplotlib dan
pillow
9. Untuk library PyQt dikarenakan sudah include di dalam Python versi 3 hanya tinggal instal saja
di command promt tanpa harus mendownload. Ketikkan ‘pip install PyQt5’
10. Untuk menambahkan PyQt designer sebagai editor untuk mendesain halaman antarmuka
Python, maka ketikan di cmd ‘pip install pyqt5-tools’
4
Gambar 8. Nama Python file
6. Langkah berikutnya melakukan setting environment dengan cara pada toolbar bagian atas
klik File>>Setting
5
10. Selanjutnya panel kiri klik Virtualenv Environment, pada panel kanan klik pada checkbox New
Environment>>Base Interpreter dirujuk ke python.exe di folder tempat menginstal python
6
Gambar 13. Load all library
7
A. MENINGKATKAN KUALITAS CITRA-OPERASI TITIK
Library openCV2
merupakan library computer vision yang dapat digunakan sebagai library
dalam digital image processing
8
Gambar 15. Paste gambar dalam projek
3. Kemudian akan keluar halaman konfirmasi paste file, isikan nama file
gambar tersebut dan pastikan direktorinya disimpan di lokasi yang
sama dengan projeknya, kemudian klik Ok
Listing program Pada halaman main dapat diketikkan coding untuk memanggil file gambar
import cv2 //library opencv
9
Judul PRAKTEK A2- MENAMPILKAN CITRA
Library openCV2
merupakan library computer vision yang dapat digunakan sebagai library
dalam digital image processing
10
8. Posisikan sehingga seperti pada tampilan berikut ini atau
praktikan dapat kustomisasi kembali desain antarmuka
11
self.image=None
self.loadButton.clicked.connect(self.loadClicked)
#membuat prosedur button clicked
@pyqtSlot()
def loadClicked(self):
self.loadImage('koala.jpg')
#membuat prosedur load image
def loadImage(self,flname):
self.image=cv2.imread(flname)
self.displayImage()
#membuat prosedur display image
ef displayImage(self):
qformat=QImage.Format_Indexed8
if len(self.image.shape)==3: #row[0],col[1],channel[2]
if (self.image.shape[2])==4:
qformat=QImage.Format_RGBA8888
else:
qformat=QImage.Format_RGB888
img=QImage(self.image,self.image.shape[1],self.image.shape[0],
self.image.strides[0],qformat)
self.imgLabel.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.Al
ignVCenter)
12
3. Tambahkan coding untuk menampilkan gambar strecth sesuai ukuran
image label pada halaman GUI yang disediakan
Def loadImage(self,flname):
self.image=cv2.imread(flname,cv2.IMREAD_GRAYSCALE)
self.displayImage()
self.imgLabel.setScaledContents(True)
13
Listing Programimport sys
import cv2
Keseluruhan from PyQt5 import QtCore,QtWidgets
from PyQt5.QtWidgets import QFileDialog,QMainWindow
from PyQt5.uic import loadUi
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QImage,QPixmap
class ImageProc(QMainWindow):
def __init__(self):
super(ImageProc,self).__init__()
loadUi('showgui.ui',self)
self.image=None
self.loadButton.clicked.connect(self.loadClicked)
self.action_Load_Image.triggered.connect(self.loadClicked)
@pyqtSlot()
def loadClicked(self):
flname,filter=QFileDialog.getOpenFileName(self,'Open
File','D:\\Programming\\Python',"Image Files (*.jpg)")
if flname:
self.loadImage(flname)
else:
print('Invalid Image')
def loadImage(self,flname):
self.image=cv2.imread(flname,cv2.IMREAD_COLOR)
self.displayImage()
def displayImage(self):
qformat=QImage.Format_Indexed8
if len(self.image.shape)==3:
if(self.image.shape[2])==4:
qformat=QImage.Format_RGBA8888
else:
qformat=QImage.Format_RGB888
img=QImage(self.image,self.image.shape[1],self.image.shape[0],se
lf.image.strides[0],qformat)
#BGR>RGB
img=img.rgbSwapped()
self.imgLabel.setPixmap(QPixmap.fromImage(img))
self.imgLabel.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.Alig
nVCenter)
self.imgLabel.setScaledContents(True)
if __name__=='__main__':
app=QtWidgets.QApplication(sys.argv)
window=ImageProc()
window.setWindowTitle('Image Processing')
window.show()
sys.exit(app.exec_())
14
Judul PRAKTEK A3- KONVERSI CITRA RGB KE CITRA KEABUAN
Deskripsi Konversi citra RGB ke citra keabuan dapat dilakukan dengan beberapa
persamaan, yaitu
greyscale = 0.333R + 0.333G + 0.333B (1)
greyscale = 0.299R + 0.587G + 0.114B (2)
if windows==1:
self.imgLabel.setPixmap(QPixmap.fromImage(img))
self.imgLabel.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.Al
ignVCenter)
self.imgLabel.setScaledContents(True)
if windows==2:
self.hasilLabel.setPixmap(QPixmap.fromImage(img))
15
self.hasilLabel.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.
AlignVCenter)
self.hasilLabel.setScaledContents(True)
set windows==1 untuk menampilkan citra RGB dan set windows==2 untuk
menampilkan citra hasil pengolahan
16
Solusi self.action_Load_Image.triggered.connect(self.loadClicked)
self.action_Save_Image.triggered.connect(self.saveClicked)
self.actionGrayscale.triggered.connect(self.grayClicked)
Listing Program
import sys
Keseluruhan import cv2
import math
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QDialog,
QApplication,QFileDialog,QMainWindow, QAction
from PyQt5.uic import loadUi
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QImage,QPixmap
import numpy as np
from matplotlib import pyplot as plt
class ImageProc(QMainWindow):
def __init__(self):
super(ImageProc,self).__init__()
loadUi('showimg.ui',self)
self.image=None
self.loadButton.clicked.connect(self.loadClicked)
self.saveButton.clicked.connect(self.saveClicked)
self.grayButton.clicked.connect(self.grayClicked)
@pyqtSlot()
def grayClicked(self):
H,W= self.image.shape[:2]
gray=np.zeros((H,W),np.uint8)
for i in range (H):
for j in range (W):
gray[i,j]=np.clip(0.07*self.image[i,j,0]+0.72*self.image[i,j,1
]+0.21*self.image[i,j,2],0,255)
self.image=gray
self.displayImage(2)
@pyqtSlot()
def loadClicked(self):
flname,filter=QFileDialog.getOpenFileName(self,'Open
File','D:\\',"Image Files (*.jpg)")
if flname:
self.loadImage(flname)
else:
print('Invalid Image')
@pyqtSlot()
def saveClicked(self):
flname, filter=QFileDialog.getSaveFileName(self,'Save
17
File','D:\\',"Image Files (*.jpg)")
if flname:
cv2.imwrite(flname,self.image)
else:
print('Error')
def loadImage(self,flname):
self.image=cv2.imread(flname,cv2.IMREAD_COLOR)
self.displayImage(1)
if len(self.image.shape)==3:
if(self.image.shape[2])==4:
qformat=QImage.Format_RGBA8888
else:
qformat=QImage.Format_RGB888
img=QImage(self.image,self.image.shape[1],self.image.shape[0],
self.image.strides[0],qformat)
#BGR>RGB
img=img.rgbSwapped()
if windows==1:
self.imgLabel.setPixmap(QPixmap.fromImage(img))
self.imgLabel.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.Al
ignVCenter)
self.imgLabel.setScaledContents(True)
if windows==2:
self.hasilLabel.setPixmap(QPixmap.fromImage(img))
self.hasilLabel.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.
AlignVCenter)
self.hasilLabel.setScaledContents(True)
if __name__=='__main__':
app=QtWidgets.QApplication(sys.argv)
window=ImageProc()
window.setWindowTitle('Image Processing')
window.show()
sys.exit(app.exec_())
18
Judul PRAKTEK A4- PENCERAHAN CITRA
(4)
Listing Program #konversikan citra RGB ke grayscale (pada proses ini menggunakan library
opencv)
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
19
a = img.item(i, j)
b = a + brightness
#terapkan proses clipping
if b > 255:
b = 255
elif b < 0:
b = 0
else:
b = b
img.itemset((i, j), b)
self.action_Load_Image.triggered.connect(self.loadClicked)
self.action_Save_Image.triggered.connect(self.saveClicked)
self.actionGrayscale.triggered.connect(self.grayClicked)
self.actionBrightness.triggered.connect(self.brightClicked)
self.actionSimple_Contrast.triggered.connect(self.contrastClicke
d)
@pyqtSlot()
def brightClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
brightness = 50
h, w = img.shape[:2]
for i in np.arange(h):
for j in np.arange(w):
a = img.item(i, j)
b = a + brightness
if b > 255:
b = 255
elif b < 0:
b = 0
else:
b = b
20
img.itemset((i, j), b)
self.image = img
self.displayImage(2)
Estimasi 25 menit
waktu
Listing Proses sama dengan pengaturan cahaya hanya nilai kontras dapat diatur sebagai beriku:
Program #tentukan konstanta nilai kontras
contrast = 1.6
#untuk masing-masing array piksel dilakukan pengali denga konstanta kontras
b = math.ceil(a * contrast)
#terapkan proses clipping
Tugas 1. Jelaskan yang dimaksud dengan citra dengan kontras rendah. Apakah efeknya?
2. Analisis jika nilai kontras diganti dengan nilai lebih kecil dan lebih besar dari
contoh yang diberikan
21
3. Analisis citra dengan membandingkan nilai piksel sebelum dan setelah dilakukan
proses kontras
4. Jelaskan library math serta jelaskan fungsi math.ceil
5. Modifikasi menggunakan trackbar untuk mengatur nilai konstanta pada halaman
GUI
contrast = 1.6
for i in np.arange(height):
for j in np.arange(width):
a = gray.item(i, j)
b = math.ceil(a * contrast)
if b > 255:
b = 255
gray.itemset((i, j), b)
self.image = gray
self.displayImage(2)
Deskripsi Rumus Peregangan kontras dilakukan untuk mengatur kontras citra berdasarkan nilai
piksel (Munir, 2004)
(6)
Dimana:
R : nilai keabuan dalam citra semula,
S : adalah nilai keabuan yang baru,
rmin: nilai keabuan terendah dari kelompok pixel
rmax: adalah nilai keabuan tertinggi dari kelompok pixel
Estimasi 20 menit
waktu
Alur Proses Alur proses sama dengan praktek mengatur kontras citra (see praktek 5)
22
1. Tentukan nilai konstanta nilai maksimum piksel dan minimum piksel, karena pada
praktek ini menggunakan citra 8 bit maka maks=255 dan min=0
2. Baca nilai array piksel
3. Jika nilai piksel pada koordinat (i,j) lebih besar dari nilai maksimum maka, nilai
piksel (i,j) sama dengan nilai maksimum dan
4. jika nilai piksel (i,j) lebih kecil dari nilai minimum maka nilai piksel (,j) sama dengan
nilai minimum
5. Setelah itu untuk setiap nilai piksel dalam matriks citra diproses dengan
menerapkan Persamaan (6)
6. Display image
Tugas Berdasarkan percobaan sebelumnya yang telah dilakukan, merujuk kepada alur
proses yang telah dijabarkan :
1. Gambarkan flowchart proses Contrast Stretching dengan asumsi citra yang
diinputkan sudah merupakan citra keabuan
2. Implementasikan dalam coding python
3. Analisis citra dengan membandingkan nilai piksel sebelum dan setelah
dilakukan proses pengolahan
@pyqtSlot()
def stretchingContrastClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
h, w = img.shape[:2]
min = 255
max = 0
for i in np.arange(h):
for j in np.arange(w):
a = img.item(i, j)
if a > max:
max = a
if a < min:
min = a
for i in np.arange(h):
for j in np.arange(w):
a = img.item(i, j)
b = float(a - min) / (max - min) * 255
img.itemset((i, j), b)
self.image = img
self.displayImage(2)
23
Judul PRAKTEK A7- NEGATIVE IMAGE
Estimasi 20 menit
waktu
Alur Proses Alur proses sama dengan praktek mengatur kontras citra (see praktek 5)
1. Tentukan nilai konstanta maximum_intensity = 255
2. Baca nilai array piksel
3. Terapkan Persamaan (7)
4. Display image
Tugas Berdasarkan percobaan sebelumnya yang telah dilakukan, merujuk kepada alur
proses yang telah dijabarkan :
1. Jika diketahui matriks citra piksel sebagai berikut, Konversikancitra keabuan
menjadi citra negatif dengan derajat keabuan 8 bit
24
4. Analisis citra dengan membandingkan nilai piksel sebelum dan setelah
dilakukan proses pengolahan
Solusi @pyqtSlot()
def negatifClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
h, w = img.shape[:2]
max_intensity = 255
for i in range(h):
for j in range(w):
a = img.item(i, j)
b = max_intensity - a
img.itemset((i, j), b)
self.image = img
self.displayImage(2)
Tugas Awal Bagaimana mekanisme mengubah citra berskala keabuan menjadi citra biner!
Gambarkan dan jelaskan dalam bentuk flowchart!
Estimasi 10 menit
waktu
Solusi @pyqtSlot()
def BinerClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
thres=100
h, w = img.shape[:2]
for i in np.arange(h):
for j in np.arange(w):
a=img.item(i,j)
if a>thres:
a=255
elif a<thres:
a=0
else:
a=a
img.itemset((i,j),a)
25
self.image = img
self.displayImage(2)
Estimasi 10 menit
waktu
Tugas 1. Analisis hasil proses histogram dari 5 buah citra keabuan yang berbeda tingkat
kecerahan dan kontrasnya
2. Jelaskan library matplotlib pada python
3. Jelaskan fungsi dari plt.hist(img.ravel(),255,[0,255])
4. Terdapat citra 4 x 4 dengan rincian nilai kecerahan piksel sbb:
Aras keabuan sebanyak 8. Bagaiamana histogram citra tersebut dalam bentuk
angka dan grafik
7 7 7 7
6 5 5 6
5 5 5 5
2 4 0 1
26
Listing @pyqtSlot()
def GrayHistogramClicked(self):
program img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
Keseluruha self.image = img
self.displayImage(2)
n plt.hist(img.ravel(), 255, [0, 255])
plt.show()
Estimasi 10 menit
waktu
Tugas 1. Analisis hasil histogram untuk 5 buah citra RGB dengan komposisi warna yang
beragam, serta tingkat kecerahan dan kontras yang berbeda
2. Berdasarkan listing program yang diberikan jelaskan masing-masing baris
3. Jelaskan fungsi calcHist
Deskripsi perataan histogram adalah mengubah derajat keabuan suatu pixel ( r) dengan derajat
keabuan yang baru ( s) dengan suatu fungsi transformasi T,
Estimasi 15 menit
waktu
27
Prerequisite Asumsi praktek sebelumnya harus sudah dikerjakan
1. Tambahkan pada halaman GUI menu Histogram Equalization
2. Beri object name adalah actionEqual_Histogram
3. Siapkan citra keabuan dengan beragam kondisi kontras dan pencahayaan
Listing @pyqtSlot()
def EqualHistogramClicked(self):
program hist, bins = np.histogram(self.image.flatten(), 256, [0, 256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max() / cdf.max()
cdf_m = np.ma.masked_equal(cdf, 0)
cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min())
cdf = np.ma.filled(cdf_m, 0).astype('uint8')
self.image = cdf[self.image]
self.displayImage(2)
plt.plot(cdf_normalized, color='b')
plt.hist(self.image.flatten(), 256, [0, 256], color='r')
plt.xlim([0, 256])
plt.legend(('cdf', 'histogram'), loc='upper left')
plt.show()
28
B. MENINGKATKAN KUALITAS CITRA-OPERASI GEOMETRI
Deskripsi Translasi citra adalah proses menggeser citra dengan menambahkan atau
mengurakan koordinat X dan Y.
Jika diilustrasikan menggunakan matriks
1 0 𝑡𝑥
𝑇 = [0 1 𝑡 ]
𝑦
Tx dan ty adalah nilai translasi, citra akan bergeser dimana x bergeserk arah
horizontal dan y bergeser arah vertikal
Deskripsi Memutar citra yang ditentukan nilai variabel rotasi sebesar terhadap
sudut 0 derajat atau horizontal dan vertikal
29
Membuat fungsi seperti pada listing program
rotationMatrix[0, 2] += (nW / 2) - w / 2
rotationMatrix[1, 2] += (nH / 2) - h / 2
rot_image = cv2.warpAffine(self.image, rotationMatrix, (h,
w))
self.image=rot_image
Tugas 1. Tambahkan event untuk setiap sub menu di menu rotasi dengan
memanggil fungsi pada listing program diatas
2. Jelaskan mengenai fungsi getRotationMatrix2D dan warpAffine
3. Tambahkan menu Transpose pada GUI QT Designer, gunakan fungsi
cv2.transpose untuk membuat prosedur transpose image
4. Jelaskan fungsi cv2.transpose
@pyqtSlot()
def RotasiMin90Clicked(self):
self.rotasi(-90)
self.displayImage(2)
.....
.....
#soal no.3
@pyqtSlot()
def TransposeClicked(self):
trans_img=cv2.transpose(self.image)
self.image=trans_img
self.displayImage(2)
30
Judul PRAKTEK B3- RESIZE
Prerequisite Menambahkan menu Resize dan sub menu yaitu Zoom In, Zoom out dan
Skewed Image (mengatur image berdasarkan dimensi yang ditentukan)
Tugas 1. Ubah tampilan sistem agar pada menu zoom in dapat memperbesar
dengan skala 2x, 3x, 4x dan buatkan event untuk dapat
menampilkan citra sesuai skala
2. Ubah tampilan sistem agar pada menu zoom out dapat
memperbesar dengan skala 1/2, 1/4, 3/4 dan buatkan event untuk
dapat menampilkan citra sesuai skala
3. Ubah tampilan sistem agar pada menu skewed dapat memperbesar
sesuai ukuran-ukuran yang tersedia dalam pengaturan resolusi
untuk layar komputer dan buatkan event untuk dapat menampilkan
citra sesuai dimensi yang ditentukan
Solusi @pyqtSlot()
def Linear_InterpolationClicked(self):
#make size 3/4 original image size
cv2.imshow('Original',self.image)
resize_img=cv2.resize(self.image,None,fx=0.50, fy=0.50)
self.image=resize_img
cv2.imshow('',self.image)
#self.displayImage(2)
@pyqtSlot()
def Cubic_InterppolationClicked(self):
#double size of original image size/zooming(scaling up)
31
cv2.imshow('Original', self.image)
resize_img=cv2.resize(self.image,None,fx=2,fy=2,interpolation=
cv2.INTER_CUBIC)
self.image = resize_img
cv2.imshow('',self.image)
#self.displayImage(2)
@pyqtSlot()
def skewed_SizeClicked(self):
#resize image based on exacat dimension
cv2.imshow('Original', self.image)
resize_img=cv2.resize(self.image,(900,400),interpolation=cv2.I
NTER_AREA)
self.image=resize_img
cv2.imshow('',self.image)
#self.displayImage(2)
Alur Proses 1. Tentukan koordinat atau posisi x (row) dan y (coloum) awal yang
diawali dari ujung kiri atas
2. Tentukan koordinat atau posisi x (row) dan y (coloum) akhir berakhir
di ujung kanan bawah
3. Set koordinat image citracitra[start row s/d end row, start col s/d end
col]
4. Tampilkan citra
Solusi @pyqtSlot()
def CropingClicked(self):
h,w=self.image.shape[:2]
#get the strating point of pixel coord(top left)
start_row, start_col=int(h*.1),int(w*.1)
#get the ending point coord (botoom right)
end_row, end_col=int(h*.5),int(w*.5)
crop=self.image[start_row:end_row,start_col:end_col]
32
cv2.imshow('Original',self.image)
cv2.imshow('Crop Image',crop)
@pyqtSlot()
def CropingClicked(self):
h,w=self.image.shape[:2]
crop=self.image[0:1000,0:500]
Prerequisite 1. Siapkan dua buah citra yang disimpan di direktori aplikasi utama
disimpan
Solusi @pyqtSlot()
def aritmatika_CitraClicked(self):
img1 = cv2.imread('img1.jpg', 0)
img2 = cv2.imread('img2.jpg', 0)
add_img = img1 + img2
subtract = img1 - img2
subtract2=img2-img1
mul = img1 * img2
div = img1 / img2
33
Judul PRAKTEK C2-OPERASI BOOLEAN
Prerequisite 1. Siapkan dua buah citra yang disimpan di direktori projek disimpan
Tugas 1. Tambahkan untuk dapat menampilkan dua buah citra untuk operator
OR, XOR
2. Analisis dari hasil proses citra yang diproses operasi boolean tersebut
3. Analisis citra dari perubahan piksel sebelum dan setelah dilakukan
operasi!
Solusi @pyqtSlot()
def Logika_ANDClicked(self):
img1 = cv2.imread('img1.jpg', 1)
img2 = cv2.imread('img2.jpg', 1)
img1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
op_and=cv2.bitwise_and(img1,img2)
op_or=cv2.bitwise_or(img2,img2)
op_xor=cv2.bitwise_xor(img1,img2)
34
D. MENINGKATKAN KUALITAS CITRA-OPERASI SPASIAL
35
Estimasi waktu 20 menit
Prerequisite Siapkan 5 buah citra yang telah diedit menggunakan tools editing image
seperti Adobe Photoshop, atur sehingga citra tersebut memiiki noise
seperti salt & papper, Spike dll
36
kernel = array piksel kernel
X_height = X.shape[0]
X_width = X.shape[1]
F_height = F.shape[0]
F_width = F.shape[1]
H = (F_height) // 2
W = (F_width) // 2
return out
37
kernel = np.array(
[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
SOLUSI @pyqtSlot()
def MeanClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
mean = (1.0 / 9) * np.array(
[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
38
img_out = conv(img, mean)
Soal no.3 berikan studi kasus berupa matriks piksel ukuran 5x5 kemudian
konvolusi secara manual menggunakan kernel mean. Analisis hasil matriks
yang diperoleh dan hubungkan dengan hasil blurring citra.
1
𝐺(𝑥,𝑦) = exp(−(𝑥 2 + 𝑦 2 )/2𝜎 2 (8)
2𝜋𝜎2
Dimana adalah standar deviasi dan distribusi biasanya diatur =1
X,y adalah posisi koordinat pada kernel
39
Kernel Gaussian
Ubah supaya nilai di dalam matriks menjadi bilangan bulat, maka di kali
dengan 1/345
1 5 7 5 1
1 5 20 33 20 5
7 33 55 33 7
345
5 20 33 20 5
[1 5 7 5 1]
@pyqtSlot()
def SmoothClicked(self):
img=cv2.cvtColor(self.image,cv2.COLOR_BGR2GRAY)
#h,w=img.shape[:2]
gauss =(1.0 / 345)* np.array(
[[1, 5, 7, 5, 1],
[5, 20, 33, 20, 5],
[7, 33, 55, 33, 7],
[5, 20, 33, 20, 5],
[1, 5, 7, 5, 1]])
img_out=conv(img,gauss)
plt.imshow(img_out,cmap=’gray’,interpolation=’bicubic’)
plt.xticks([],plt.yticks([]))
plt.show()
Deskripsi Operasi penajaman citra bertujuan memperjelas tepi pada objek di dalam
citra atau menghilangkan bagian citra yang lembut. Operasi penajaman
dilakukan dengan melewatkan citra pada penapis lolos-tinggi (high-pass
filter).
40
Gambar 23. Kernel low pass filter
SOLUSI @pyqtSlot()
def SharpClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
laplace = (1.0 / 16) * np.array(
[[0, 0, -1, 0, 0],
[0, -1, -2, -1, 0],
[-1, -2, 16, -2, -1],
[0, -1, -2, -1, 0],
[0, 0, -1, 0, 0]])
41
Deskripsi Median filer berbeda dengan yang sudah dikerjakan pada praktek D1-D4 yan
merupakan filterisasi secara linear, 3 modul praktek berikutnya merupakan
proses filterisasi non linear .
9 10 10 10 10 10 11 12 35
Median dari kelompok tersebut adalah 10
Hasil setelah median filter
42
for l=-3 to 4
a=image(i+k,j+l)
menambahkan a ke neighbors
end for
end for
mengurutkan neighbors
median=posisi neighbors ke-24
posisikan nilai piksel sebelumnya dengan nilai median
end for
end for
tampilkan citra hasil median
Solusi @pyqtSlot()
def MedianClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
img_out=img.copy()
h,w=img.shape[:2]
for i in np.arange(3,h-3):
for j in np.arange(3,w-3):
neighbors=[]
for k in np.arange(-3,4):
for l in np.arange(-3,4):
a=img.item(i+k, j+l)
neighbors.append(a)
neighbors.sort()
median=neighbors[24]
b=median
img_out.itemset((i,j),b)
43
Deskripsi Maximum filter adalah proses menggantikan nilai piksel dengan nilai piksel
maksimum yang dipengaruhi piksel area tetangga.
Solusi @pyqtSlot()
def MaxClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
img_out = img.copy()
h, w = img.shape[:2]
44
for i in np.arange(3, h - 3):
for j in np.arange(3, w - 3):
max = 0
for k in np.arange(-3, 4):
for l in np.arange(-3, 4):
a = img.item(i + k, j + l)
if a > max:
max=a
b=max
img_out.itemset((i, j), b)
@pyqtSlot()
def MinClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
img_out = img.copy()
h, w = img.shape[:2]
45
F. DETEKSI TEPI CITRA
46
Solusi @pyqtSlot()
def SobelClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
Sx = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]])
self.image=img
self.displayImage(2)
plt.imshow(img_out, cmap='gray', interpolation='bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()
def PrewittClicked(self):
img = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
Px = np.array([[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]])
Py = np.array([[-1, -1, -1],
[0, 0, 0],
[1, 1, 1]])
47
self.image = img
self.displayImage(2)
plt.imshow(img_out,cmap = 'gray',interpolation='bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()
48
EDGE DETECTION
49
Derajat 22,5 - 67,5 → 450 berwarna kuning
Derajat 67,5 - 112,5 → 900 berwarna merah
Derajat 112,5 - 157,5 → 1350 berwarna hijau
Jika gradient (i,j) ≤ dari gradient (i-1,j+1) atau gradient (i,j) ≤ dari gradient
(i+1,j-1) maka gradient (I,j) sama dengan 0, akan tetapi bila gradient (i,j)
dari gradient (i-1,j+1) atau gradient (i,j) dari gradient (i+1,j-1) maka gradient
(I,j) sama dengan tepi asli
# angle 0
if (0 <= angle[i, j] < 22.5) or (157.5 <= angle[i,
j] <= 180):
q = img_out[i, j + 1]
r = img_out[i, j - 1]
# angle 45
elif (22.5 <= angle[i, j] < 67.5):
q = img_out[i + 1, j - 1]
r = img_out[i - 1, j + 1]
# angle 90
elif (67.5 <= angle[i, j] < 112.5):
q = img_out[i + 1, j]
r = img_out[i - 1, j]
# angle 135
elif (112.5 <= angle[i, j] < 157.5):
q = img_out[i - 1, j - 1]
r = img_out[i + 1, j + 1]
except IndexError as e:
pass
img_N = Z.astype("uint8")
50
Tepian yang kuat diintepretasikan sebagai " tepian yang pasti " dan
dapat segera dimasukkan sebagai tepian pada gambar akhir.
Tepi lemah termasuk jika dan hanya jika terhubung ke tepi yang
kuat, dengan logika bahwa noise dan variasi warna tidak mungkin
untuk menghasilkan tepi yang kuat (dengan penyesuaian yang tepat
dari thresholding).
img_N.itemset((i, j), b)
img_H1 = img_N.astype("uint8")
cv2.imshow("hysteresis part 1", img_H1)
strong = 255
for i in range(1, H-1):
for j in range(1, W-1):
if (img_H1[i,j] == weak):
try:
if ((img_H1[i+1, j-1] == strong) or
(img_H1[i+1, j] == strong) or
(img_H1[i+1, j+1] == strong) or
(img_H1[i, j-1] == strong) or (img_H1[i, j+1] == strong) or
(img_H1[i-1, j-1] == strong) or
(img_H1[i-1, j] == strong) or (img_H1[i-1, j+1] == strong)):
img_H1[i, j] = strong
else:
img_H1[i, j] = 0
except IndexError as e:
pass
img_H2 = img_H1.astype("uint8")
51
G. MORFOLOGI CITRA
Prerequisite 1. Sudah membuat menu file Morfologi dengan sub menu Dilasi, Erosi,
Opening dan Closing
2. Siapkan beberapa citra hitam putih berupa karakter (huruf atau
angka), seperti contoh dibawah ini
52
H. SEGMENTASI CITRA
Prerequisite 1. Sudah membuat menu file Local Thresholding dengan sub menu
Binary, Binary Invers, Trunc, To Zero, To Zero Invers
keterangan:
untuk fungsi thresholding binary dapat menggunakan fungsi ini:
cv2.THRESH_BINARY
untuk fungsi thresholding inversi biner dapat menggunakan fungsi ini:
cv2.THRESH_BINARY_INV
untuk fungsi thresholding trunc dapat menggunakan fungsi ini:
cv2.THRESH_TRUNC
53
untuk fungsi thresholding to Zero dapat menggunakan fungsi ini:
cv2.THRESH_TOZERO
untuk fungsi thresholding inversi to Zero dapat menggunakan fungsi ini:
cv2.THRESH_TOZERO_INV
Tugas 1. Jika diketahui sebuah citra dengan derajat keabuan 8 level atau 3 bit
sebagai berikut, jika diberikan nilai ambang T=4 maka tentukan hasil
matriks citra setelah dithresholding menggunakan lima type dari
fungsi threshold di atas
3 0 1 5
7 6 0 4
2 7 0 6
1 3 5 5
2. Buatlah program untuk dapat men-thresholding citra menggunakan 5
tipe threshold
3. Analisis perbedaan hasil pengujian citra dengan penerapan kelima type
global threshold secara matriks dan visualiasi citra
54