You are on page 1of 19

PHẦN GET DATA

import numpy as np
import os
import sqlite3
import cv2
 Dòng này import các module cần thiết: numpy (thư viện để làm việc với
mảng và ma trận), os (để làm việc với hệ thống tệp tin), sqlite3 (để làm
việc với cơ sở dữ liệu SQLite), và cv2 (OpenCV, thư viện xử lý ảnh và
video).
def insertOrUpdate(id, name):
conn = sqlite3.connect("FaceBase.db")
query = "SELECT * FROM People WHERE ID="+str(id)
cursor = conn.execute(query)
isRecordExist = 0
for row in cursor:
isRecordExist = 1
if isRecordExist == 1:
query = "UPDATE People SET Name='" + str(name) + "' WHERE ID=" + str(id)
else:
query = "INSERT INTO People(ID, Name) VALUES(" + str(id) + ",'" + str(name) +
"')"
conn.execute(query)
conn.commit()
conn.close()
 Đây là một hàm insertOrUpdate để chèn hoặc cập nhật dữ liệu người dùng
vào cơ sở dữ liệu.
 Đầu tiên, hàm này kết nối đến cơ sở dữ liệu SQLite có tên "FaceBase.db"
bằng cách sử dụng sqlite3.connect.
 Sau đó, nó kiểm tra xem đã có mục với id tương ứng trong bảng
"People" chưa bằng cách thực hiện truy vấn SQL SELECT * FROM People
WHERE ID=id. Nếu kết quả trả về không rỗng, isRecordExist được đặt thành
1.
 Dựa trên giá trị của isRecordExist, hàm xây dựng một truy vấn SQL để cập
nhật hoặc chèn dữ liệu người dùng. Nếu isRecordExist là 1, truy vấn sẽ
là UPDATE People SET Name='name' WHERE ID=id , nếu không, truy vấn sẽ là INSERT
INTO People(ID, Name) VALUES(id,'name') .
 Cuối cùng, hàm thực thi truy vấn bằng cách sử dụng conn.execute, lưu
thay đổi bằng conn.commit, và đóng kết nối bằng conn.close.
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)
 Dòng này tạo một đối tượng CascadeClassifier từ file
XML "haarcascade_frontalface_default.xml". Đối tượng này được sử dụng để
phát hiện khuôn mặt trong ảnh.
 Dòng thứ hai tạo một đối tượng VideoCapture từ thiết bị đầu vào video số
0 (thiết bị webcam mặc định).
id = input('Enter User ID: ')
name = input('Enter Your Name: ')

insertOrUpdate(id, name)
 Dòng này yêu cầu người dùng nhập ID và tên của mình.
 Sau đó, nó gọi hàm insertOrUpdate để chèn hoặc cập nhật thông tin
người dùng trong cơ sở dữ liệu.

Đoạn code bạn đưa ra là một vòng lặp vô hạn để chụp hình ảnh khuôn mặt từ
video đầu vào (webcam) và lưu chúng vào thư mục 'data_face'. Dưới đây là
cách nó hoạt động:
 sample_number = 0: Khởi tạo biến sample_number với giá trị ban đầu là 0, đại
diện cho số lượng hình ảnh khuôn mặt đã được chụp.
 while True:: Bắt đầu một vòng lặp vô hạn.
 ret, img = cap.read(): Đọc một khung hình từ thiết bị đầu vào video
(webcam) và lưu nó vào biến img. Biến ret chỉ ra liệu việc đọc khung hình
có thành công hay không.
 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) : Chuyển đổi khung hình từ ảnh
màu sang ảnh xám (grayscale) để dễ dàng xử lý.
 faces = face_cascade.detectMultiScale(gray, 1.3, 5) :Sử
dụng face_cascade (đối tượng CascadeClassifier) để phát hiện khuôn mặt
trong khung hình xám. Kết quả trả về là một danh sách các hình chữ
nhật (x, y, w, h) đại diện cho vị trí và kích thước của các khuôn mặt được
phát hiện.
 for (x, y, w, h) in faces:: Lặp qua danh sách các khuôn mặt đã phát
hiện.

 sample_number += 1:Tăng biến sample_number lên 1 để đếm số lượng


hình ảnh đã chụp.
 if not os.path.exists('data_face'): os.makedirs('data_face') : Kiểm tra
xem thư mục 'data_face' đã tồn tại chưa. Nếu không tồn tại, tạo
thư mục mới.
 cv2.imwrite('data_face/face_'+str(id)+"."+str(sample_number)+".jpg",
img[y:y+h,x:x+w]):Lưu ảnh khuôn mặt vào thư mục 'data_face' với
tên tệp tin được định dạng là 'face_id.sample_number.jpg'. Ảnh
khuôn mặt được cắt từ khung hình gốc bằng cách chỉ định vùng
quan tâm bằng tọa độ (x, y, w, h).
 cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) : Vẽ một hình
chữ nhật màu xanh lá cây xung quanh khuôn mặt trên khung hình
gốc để chỉ ra vị trí của khuôn mặt.
 cv2.imshow('WEDCAM', img): Hiển thị khung hình gốc với các khuôn mặt đã
phát hiện và hình chữ nhật xung quanh chúng.
 cv2.waitKey(1): Chờ một phím được nhấn trong 1ms. Nếu một phím được
nhấn, vòng lặp tiếp tục. Điều này cho phép người dùng dừng lại và
thoát khỏi vòng lặp bằng cách nhấn một phím bất kỳ.
 if (sample_number > 99):: Kiểm tra xem đã chụp đủ số lượng hình ảnh cần
thiết hay chưa. Nếu sample_number lớn hơn 99, tức đã chụp đủ 100 hình
ảnh (giả sử từ 1 đến 100), thì thực hiện các bước sau:

 cap.release():
Giải phóng thiết bị đầu vào video (webcam).
 cv2.destroyAllWindows(): Đóng tấtcả các cửa sổ hiển thị.
 break: Thoát khỏi vòng lặp while, kết thúc chương trình.
Đoạn code trên cho phép bạn chụp và lưu 100 hình ảnh khuôn mặt từ video
đầu vào (webcam), và các hình ảnh được lưu trong thư mục 'data_face'
PHẦN TRAINING
#giải thích cụ thể từng mục
Đoạn mã trên có chức năng huấn luyện mô hình nhận diện khuôn mặt sử
dụng thuật toán LBPH (Local Binary Patterns Histograms). Hãy xem từng dòng
mã để hiểu cụ thể:
python
Copy
import os
import cv2
import numpy as np
 Dòng đầu tiên import module os để làm việc với hệ thống tệp tin,
module cv2 để làm việc với OpenCV (thư viện xử lý ảnh và video), và
module numpy để làm việc với mảng và ma trận.
python
Copy
recognizer = cv2.face_LBPHFaceRecognizer.create()
 Dòng này tạo một đối tượng recognizer từ lớp cv2.face_LBPHFaceRecognizer.
Đối tượng này sẽ được sử dụng để huấn luyện và nhận diện khuôn mặt.
python
Copy
path = 'C:/Users/5530 4k/Phan mem Nhan dien khuon mat/data_face'
 Dòng này đặt đường dẫn tới thư mục chứa dữ liệu ảnh khuôn mặt. Bạn
cần điều chỉnh đường dẫn này để phù hợp với thư mục của bạn.
python
Copy
def getImagesWithID(path):
imagePaths=[os.path.join(path, f) for f in os.listdir(path)]
faces=[]
IDs=[]
for imagePath in imagePaths:
rgbImage = cv2.imread(imagePath)
grayImage = cv2.cvtColor(rgbImage, cv2.COLOR_BGR2GRAY)
faceNp = np.array(grayImage, 'uint8')
ID=int(os.path.split(imagePath)[-1].split('.')[1])
faces.append(faceNp)
IDs.append(ID)
cv2.imshow('Training', faceNp)
cv2.waitKey(10)
return np.array(IDs), faces
 Đây là một hàm getImagesWithID để đọc các ảnh khuôn mặt từ thư mục và
trích xuất các khuôn mặt và ID tương ứng. Hàm này nhận đường
dẫn path và trả về một mảng IDs chứa các ID tương ứng với mỗi khuôn
mặt và một mảng faces chứa các ảnh khuôn mặt đã được chuyển đổi
sang dạng mảng numpy.
python
Copy
Ids, faces = getImagesWithID(path)
 Dòng này gọi hàm getImagesWithID để nhận các mảng IDs và faces từ thư
mục chứa dữ liệu ảnh khuôn mặt.
python
Copy
recognizer.train(faces, Ids)
 Dòng này sử dụng mô hình nhận diện recognizer để huấn luyện với các
ảnh khuôn mặt trong mảng faces và các ID tương ứng trong mảng Ids.
python
Copy
if not os.path.exists('trainer'):
os.makedirs('trainer')
 Dòng này kiểm tra xem thư mục "trainer" có tồn tại hay không. Nếu
không tồn tại, nó sẽ tạo thư mục mới.
python
Copy
recognizer.save("trainer/face-trainner.yml")
 Dòng này lưu mô hình đã được huấn luyện vào tệp tin "trainer/face-
trainner.yml".
python
Copy
cv2.destroyAllWindows()
 Dòng cuối cùng đóng tất cả các cửa sổ hiển thị ảnh.
#giải thích cụ thể dòng
import os
import cv2
import numpy as np
 Dòng này import các module cần thiết: os (để làm việc với hệ thống tệp
tin), cv2 (OpenCV, thư viện xử lý ảnh và video), và numpy (thư viện để làm
việc với mảng và ma trận).
python
Copy
recognizer = cv2.face_LBPHFaceRecognizer.create()
 Dòng này tạo một đối tượng recognizer từ lớp cv2.face_LBPHFaceRecognizer.
Đối tượng này sẽ được sử dụng để huấn luyện và nhận diện khuôn mặt.
python
Copy
path = 'C:/Users/5530 4k/Phan mem Nhan dien khuon mat/data_face'
 Dòng này đặt đường dẫn tới thư mục chứa dữ liệu ảnh khuôn mặt. Bạn
cần điều chỉnh đường dẫn này để phù hợp với thư mục của bạn.
python
Copy
def getImagesWithID(path):
imagePaths=[os.path.join(path, f) for f in os.listdir(path)]
faces=[]
IDs=[]
for imagePath in imagePaths:
rgbImage = cv2.imread(imagePath)
grayImage = cv2.cvtColor(rgbImage, cv2.COLOR_BGR2GRAY)
faceNp = np.array(grayImage, 'uint8')
ID=int(os.path.split(imagePath)[-1].split('.')[1])
faces.append(faceNp)
IDs.append(ID)
cv2.imshow('Training', faceNp)
cv2.waitKey(10)
return np.array(IDs), faces
 Đây là một hàm getImagesWithID để đọc các ảnh khuôn mặt từ thư mục và
trích xuất các khuôn mặt và ID tương ứng.
 Dòng đầu tiên của hàm này tạo một danh sách imagePaths chứa đường
dẫn đầy đủ tới từng tệp tin ảnh trong thư mục path.
 Hàm sẽ duyệt qua từng đường dẫn ảnh trong imagePaths và thực hiện các
bước sau:
 Sử dụng cv2.imread để đọc ảnh màu từ đường dẫn.
 Sử dụng cv2.cvtColor để chuyển đổi ảnh màu sang ảnh xám
(grayscale).
 Chuyển đổi ảnh xám thành mảng numpy faceNp với kiểu dữ
liệu uint8.
 Từ đường dẫn ảnh, trích xuất ID của khuôn mặt bằng cách lấy
phần tử sau dấu chấm cuối cùng của tên tệp tin.
 Thêm faceNp và ID vào danh sách faces và IDs.
 Hiển thị ảnh khuôn mặt trong cửa sổ "Training" bằng cv2.imshow.
 Chờ 10ms để cửa sổ hiển thị ảnh (sử dụng cv2.waitKey).
 Cuối cùng, hàm trả về một mảng numpy IDs chứa các ID tương ứng với
mỗi khuôn mặt và một mảng faces chứa các ảnh khuôn mặt đã được
chuyển đổi sang dạng mảng numpy.
python
Copy
Ids, faces = getImagesWithID(path)
 Dòng này gọi hàm getImagesWithID để nhận các mảng IDs và faces từ thư
mục chứa dữ liệu ảnh khuôn mặt.
python
Copy
recognizer.train(faces, Ids)
 Dòng này sử dụng mô hình nhận diện recognizer để huấn luyện vớicác
ảnh khuôn mặt trong mảng faces và các ID tương ứng trong mảng Ids.
python
Copy
if not os.path.exists('trainer'):
os.makedirs('trainer')
 Dòng này kiểm tra xem thư mục "trainer" có tồn tại hay không. Nếu
không tồn tại, nó sẽ tạo thư mục mới bằng cách sử dụng os.makedirs.
python
Copy
recognizer.save("trainer/face-trainner.yml")
 Dòng này lưu mô hình đã được huấn luyện vào tệp tin "trainer/face-
trainner.yml" bằng cách sử dụng phương thức save của đối
tượng recognizer.
python
Copy
cv2.destroyAllWindows()
 Dòng cuối cùng đóng tất cả các cửa sổ hiển thị ảnh bằng cách sử
dụng cv2.destroyAllWindows().

PHẦN NHẬN DIỆN


import cv2
import numpy as np
import serial
import time
import pyttsx3

face_classifier = cv2.CascadeClassifier('C:/Users/5530 4k/Phan mem Nhan dien


khuon mat/haarcascade_frontalface_default.xml')

def speak(audio):
engine.say(audio)
engine.runAndWait()

engine = pyttsx3.init('sapi5') #Speech Application Programming Interface


voices = engine.getProperty('voices')
engine.setProperty("voice", voices[0].id)
engine.setProperty("rate", 140)
engine.setProperty("volume", 1000)

# Tải mô hình đã được huấn luyện


model = cv2.face.LBPHFaceRecognizer_create()
model.read("trainer/face-trainner.yml")

def face_detector(img, size=0.5):


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_classifier.detectMultiScale(gray, 1.3, 5)

if len(faces) == 0:
return img, []

for (x, y, w, h) in faces:


cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
roi = img[y:y+h, x:x+w]
roi = cv2.resize(roi, (200, 200))

return img, roi

cap = cv2.VideoCapture(0)

1. import cv2: Import thư viện OpenCV để làm việc với ảnh và video.
2. import numpy as np: Import thư viện numpy để làm việc với mảng nhiều
chiều.
3. import serial: Import thư viện serial để giao tiếp với Arduino qua cổng
COM.
4. import time: Import thư viện time để tạo độ trễ trong quá trình giao tiếp.
5. import pyttsx3: Import thư viện pyttsx3 để chuyển đổi văn bản thành
giọng nói.
6. face_classifier = cv2.CascadeClassifier('C:/Users/5530 4k/Phan mem Nhan dien
khuon mat/haarcascade_frontalface_default.xml') :Khởi tạo bộ phân loại
khuôn mặt bằng cách tải mô hình đã được huấn luyện từ tệp tin XML.
7. def speak(audio): Định nghĩa hàm speak để phát âm thanh từ văn bản sử
dụng thư viện pyttsx3.
8. engine = pyttsx3.init('sapi5'): Khởi tạo đối tượng engine của pyttsx3 để sử
dụng giao diện lập trình ứng dụng ứng dụng (SAPI).
9. voices = engine.getProperty('voices'): Lấy danh sách các giọng nói có sẵn.
10. engine.setProperty("voice", voices[0].id) : Thiết lập giọng nói mặc định cho
engine.
11. engine.setProperty("rate", 140): Thiết lập tốc độ giọng nói.
12. engine.setProperty("volume", 1000): Thiết lập âm lượng giọng nói.
13. model = cv2.face.LBPHFaceRecognizer_create() : Khởi tạo mô hình nhận dạng
khuôn mặt bằng thuật toán LBPH (Local Binary Patterns Histograms).
14. model.read("trainer/face-trainner.yml"): Đọc mô hình nhận dạng khuôn
mặt từ tệp tin đã được huấn luyện.
15. def face_detector(img, size=0.5): Định nghĩa hàm face_detector để phát hiện
khuôn mặt trong khung hình.
16. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) : Chuyển đổi ảnh màu sang ảnh
xám.
17. faces = face_classifier.detectMultiScale(gray, 1.3, 5) : Sử dụng bộ phân loại
khuôn mặt để phát hiện các khuôn mặt trong ảnh.
18. if len(faces) == 0: return img, []: Nếu không tìm thấy khuôn mặt, trả về
ảnh gốc và danh sách rỗng.
19. for (x, y, w, h) in faces: ...: Duyệt qua danh sách các khuôn mặt đã
được phát hiện và vẽ hình chữ nhật xung quanh chúng trên ảnh.
20. roi = img[y:y+h, x:x+w]: Cắt phần ảnh chứa khuôn mặt.
21. roi = cv2.resize(roi, (200, 200)): Điều chỉnh kích thước khuôn mặt thành
(200, 200).
22. return img, roi: Trả về ảnh đóng dấu và khuôn mặt đã được cắt.
23. cap = cv2.VideoCapture(0): Mở thiết bị đầu vào video (webcam) để lấy
khung hình.
24. while True: ...: Vòng lặp vô hạn để xử lý từng khung hình.
25. ret, frame = cap.read(): Đọc một khung hình từ thiết bị đầu vào video.
26. image, face = face_detector(frame): Gọi hàm face_detector để phát hiện
khuôn mặt trong khung hình.
27. try: ...: Bắt đầu một khối try-except để xử lý ngoại lệ khi không tìm
thấy khuôn mặt.
28. face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY) : Chuyển đổi khuôn mặt đã
phát hiện sang ảnh xám.
29. result = model.predict(face): Sử dụng mô hình nhận dạng khuôn mặt để
dự đoán kết quả nhận dạng.
30. if result[1] < 500: ...: Kiểm tra độ tự tin của kết quả nhận dạng.
31. confidence = int((1 - (result[1]) / 300) * 100) : Tính toán độ tự tin dựa trên
kết quả nhận dạng.
32. display_string = str(confidence): Chuyển đổi độ tự tin sang chuỗi để hiển
thị.
33. cv2.putText(image, display_string, (100, 120),
cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 1, (0, 255, 0)) : Vẽ văn bản trên khung
hình để hiển thị độ tự tin.
34. if confidence >= 80: ...: Kiểm tra độ tự tin để xác định xem khuôn mặt đã
được nhận dạng thành công hay không.
35. cv2.putText(image, "UNLOCKED", (250, 450), 0, 1, (0, 255, 0), 2, cv2.LINE_AA) :
Vẽ văn bản "UNLOCKED" trên khung hình.
36. cv2.imshow('face', image): Hiển thị khung hình với các đánh dấu và văn
bản.
37. x += 1: Tăng biến đếm x lên 1.
38. else: ...: Xử lý khi khuôn mặt không được nhận dạng thành công.
39. cv2.putText(image, "LOCKED", (250, 450), 0, 1, (0, 255, 0), 2, cv2.LINE_AA) :
Vẽ văn bản "LOCKED" trên khung hình.
40. cv2.imshow('face', image): Hiển thị khung hình với các đánh dấu và văn
bản.
41. except: ...: Xử lý khi không tìm thấy khuôn mặt trong khung hình.
42. cv2.putText(image, "FACE NOT FOUND", (250, 450), 0, 1, (0, 255, 0), 2,
cv2.LINE_AA): Vẽ văn bản "FACE NOT FOUND" trên khung hình.
43. cv2.imshow('face', image): Hiển thị khung hình với văn bản "FACE NOT
FOUND".
Unit 1
1. 3G or 4G : are different generations of mobile network technology.
2. Open source: is something people can modify and share because its design is
publicly accessible.
3. Wifi stands for Wireless Fidelity : is a wireless technology used to connect
computers, tablets, smartphones and other devices to the internet.
4. Wi-max stands for Worldwide Interoperability for Microwave Access: is a
wireless technology that provides high-speed internet access over a wide area.
Unit 2
5. Mapping is the process of creating visual representations of places or
information.
6. Tracking : the act of monitoring and recording the position, movement, or
activities of an object, person, or event over time.
7. The function of navigation: is to guide and assist in the movement of objects,
vehicles, or individuals from one location to another.
8. GPS stands for Global Positioning System : is a technology that uses satellites
to help determine your exact location on Earth.
Unit 3
9. Bespoke: is something specially produced for someone.
10. Bugs: errors or defects in program or computer systems.
11. Cutover: is final move to a new system.
12. Modular: in separate, independent sections.
Unit 4
13. WAN (Wide area network): series of LANs linked together to form a network
in an extended area.
14. LAN ( Local area network): a series of computers linked together to form a
network in a circumscribed location.
15. DSL stands for Digital Subscriber Line: is a technology that allows high-speed
internet access over traditional copper telephone lines
16. PBX stands for (Private Branch Exchange): is a telephone system used within
organizations to manage incoming and outgoing phone calls.
Unit 5
17. Downtime: is when a system, service, or operation is not working or available.
18. -Phishing: is when attackers try to trick people into giving away their personal
information.
-To avoid phising: be cautious of suspicious emails or messages, verify the
source before sharing personal information,…
19. White hat hackers: are individuals or professionals who use their hacking skills
for good purposes.
20. A firewall: is like a security guard for your computer or network.
Unit 6
21. FME stands for (Feature Manipulation Engine): a powerful data integration
and transformation software.
22. TTS stands for (Text to speech): a technology that converts written text into
spoken words.
23. MSA stands for (Managed Service Agreement): is a contract between a service
provider and a client that outlines the terms and conditions of the services to be
provided.
Unit 7
24. CRT stands for (Cathode Ray Tube): a display technology that was widely used
in older television sets and computer monitors.
25. LCD stands for (Liquid Crystal Display): a flat-panel display technology used in
modern electronic devices like televisions, computer monitors.
26. VOD stands for (Video On Demand): is a service that allows users to select and
watch video content whenever they want.
27. License fee: is a payment made to obtain the legal right to use a product,
service, or intellectual property.
Unit 8
28. RFID stands for (Radio Frequency Identification): is a technology that uses
radio waves to wirelessly identify and track objects or individuals.
29. VoIP stands for (Voice over Internet Protocol): is a technology that enables
the transmission of voice over the internet.
30. DICOM stands for ( Digital Imaging and Communications): is a standard for
the storage, sharing, and transmission of medical images and related
information.
THỰC HÀNH
Bài 1:
Main1
import cv2

# Chuyển đổi ảnh màu thành ảnh đa mức xám


anh_cu = 'C:/Users/5530 4k/bai1/XLATCN.jpg'
anh_moi = 'C:/Users/5530 4k/bai1/anh_xam.jpg'

anhmau = cv2.imread(anh_cu)
anhxam = cv2.cvtColor(anhmau, cv2.COLOR_BGR2GRAY)
cv2.imshow('ANH DA CAP XAM', anhxam)
cv2.waitKey(0)
cv2.imwrite(anh_moi, anhxam)

# Hiển thị các thông số chiều rộng, chiều cao và độ sâu của ảnh mới
anhxam = cv2.imread(anh_moi)
height, width, channels = anhxam.shape
print("Chiều rộng:", width)
print("Chiều cao:", height)
print("Độ sâu:", channels)

cv2.destroyAllWindows()

Main 2
import cv2
import numpy as np

# Chuyển đổi ảnh màu thành ảnh đa mức xám


anh_cu = 'C:/Users/5530 4k/bai1/XLATCN.jpg'
anh_xam = 'C:/Users/5530 4k/bai1/anh_xam.jpg'

# Làm nhiễu Gauss và cải thiện ảnh bằng phương pháp lọc trung vị
image = cv2.imread(anh_xam) #đọc ảnh đầu vào
tb = 0 #giá trị trung bình của pp Gauss
do_lech_chuan = 50 #độ lệch chuẩn
anh_nhieu = image + np.random.normal(tb, do_lech_chuan, image.shape) #tạo
nhiễu cho ảnh xám image bằng cách thêm một mảng ngẫu nhiên giá trị trung
bình, độ lệch chuẩn, và có cùng kích thước với ảnh image.
anh_nhieu = np.uint8(np.clip(anh_nhieu, 0, 255)) #các giá trị pixel trong ảnh
nhiễu anh_nhieu nằm trong khoảng từ 0 đến 255 bằng cách sử dụng hàm np.clip()
để giới hạn giá trị và chuyển đổi kiểu dữ liệu thành uint8 (số nguyên không
dấu 8-bit).
kt_anh_nhieu = cv2.resize(anh_nhieu, (0, 0), fx=0.35, fy=0.35) # 0*0.35
kt_cuaso = 3
anh_caithien = cv2.medianBlur(anh_nhieu, kt_cuaso)
kt_anh_caithien = cv2.resize(anh_caithien, (0, 0), fx=0.35, fy=0.35)

# Hiển thị 2 ảnh cùng lúc


ket_hop_anh = cv2.hconcat([kt_anh_nhieu, kt_anh_caithien])
cv2.imshow('ANH NHIEU vs ANH CAI THIEN', ket_hop_anh)
cv2.waitKey(0)
cv2.destroyAllWindows()

Main 3
import cv2
import numpy as np

# Đọc ảnh gốc


anh_goc = cv2.imread('C:/Users/5530 4k/bai1/XLATCN.jpg')

# Chuyển đổi ảnh gốc thành ảnh xám


anh_xam = cv2.cvtColor(anh_goc, cv2.COLOR_BGR2GRAY)
kt_anhxam = cv2.resize(anh_xam, (0, 0), fx=0.35, fy=0.35)
# Áp dụng toán tử Canny để tách biên ảnh
canh_anh = cv2.Canny(anh_xam, 50, 100) # nguong anh là 50 vs 100, giá trị
càng tăng thì biên càng giảm
kt_bienanh = cv2.resize(canh_anh, (0, 0), fx=0.35, fy=0.35)
# Hiển thị ảnh mới và biên ảnh
ket_hop_anh = cv2.hconcat([kt_anhxam, kt_bienanh])
cv2.imshow('ANH MOI vs BIEN ANH', ket_hop_anh)
cv2.waitKey(0)
cv2.destroyAllWindows()

Bài 2:
import cv2
import numpy as np

# Đường dẫn tới ảnh cũ


anh_goc = 'C:/Users/5530 4k/bai2/XLATCN.jpg'
# Đọc ảnh mới
image = cv2.imread(anh_goc)
anh_moi = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Hiển thị thông số chiều rộng, chiều cao và độ sâu của ảnh
height, width = anh_moi.shape[:2]
depth = anh_moi.shape[2] if len(anh_moi.shape) == 3 else 1
print("Chiều rộng:", width)
print("Chiều cao:", height)
print("Độ sâu:", depth)

# Điều chỉnh kích thước ảnh


kt_anh_moi = cv2.resize(anh_moi, (0, 0), fx=0.30, fy=0.30) # Giảm kích thước
ảnh xuống 50%
# Thêm nhiễu muối tiêu vào ảnh
tyle_muoi = 0.02 # Tỷ lệ muối tiêu (2%)
anh_nhieu = np.copy(kt_anh_moi)
sl_muoi = np.ceil(tyle_muoi * kt_anh_moi.size)
sl_muoi = int(min(sl_muoi, kt_anh_moi.size - 1)) # Đảm bảo số lượng nhiễu
không vượt quá kích thước ảnh - 1

# Lấy ngẫu nhiên các chỉ mục hợp lệ trong ảnh


chi_so = np.random.choice(np.arange(kt_anh_moi.size), size=sl_muoi,
replace=False)
coords = np.unravel_index(chi_so, kt_anh_moi.shape)

anh_nhieu[coords] = 255

# Cải thiện ảnh bằng phương pháp lọc trung bình


kt_cuaso = 3 # 3*3
anh_caithien = cv2.blur(anh_nhieu, (kt_cuaso, kt_cuaso))

# Tách biên ảnh sử dụng toán tử Canny


bien_anh = cv2.Canny(anh_caithien, 100, 200)

# Hiển thị ảnh mới, ảnh nhiễu, ảnh đã cải thiện và biên ảnh cùng một lúc
ket_hop = cv2.hconcat([kt_anh_moi, anh_nhieu, anh_caithien, bien_anh])
cv2.imshow('ANH XAM vs ANH NHIEU vs ANH CAI THIEN vs BIEN ANH', ket_hop)
cv2.waitKey(0)
Bài 3:
import cv2
import numpy as np
import matplotlib.pyplot as plt

# Đường dẫn của ảnh cũ


image_path = "C:/Users/5530 4k/bai1/XLATCN.jpg"

# Đọc ảnh cũ
image = cv2.imread(image_path)

# Chuyển đổi ảnh cũ sang ảnh đa mức xám (ảnh mới)


gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Hiển thị Histogram của ảnh cũ


plt.hist(image.ravel(), bins=256, range=[0, 256])
plt.title('Histogram của ảnh cũ')
plt.xlabel('Giá trị pixel')
plt.ylabel('Số lượng pixel')
plt.show()
# Tách biên ảnh mới sử dụng toán tử Kirsch
kirsch_kernel = np.array([[-3, -3, 5], [-3, 0, 5], [-3, -3, 5]])
kirsch_edges = cv2.filter2D(gray_image, -1, kirsch_kernel)

# Hiển thị ảnh mới và biên ảnh trên cửa sổ figure


fig, axes = plt.subplots(1, 2, figsize=(10, 5))

axes[0].imshow(gray_image, cmap='gray')
axes[0].set_title('Ảnh mới')
axes[1].imshow(kirsch_edges, cmap='gray')
axes[1].set_title('Biên ảnh')

plt.show()
Bài 4:
import tkinter as tk
from tkinter import filedialog
import cv2
import numpy as np
from PIL import Image, ImageTk
import matplotlib.pyplot as plt

class ImageProcessingApp:
def __init__(self, win):
self.win = win
self.image = None

self.load_button = tk.Button(win, text="Mở FILE",


command=self.load_image)
self.load_button.pack()

self.histogram_button = tk.Button(win, text="Histogram",


command=self.show_histogram)
self.histogram_button.pack()

self.gauss_button = tk.Button(win, text="Làm nhiễu Gauss",


command=self.apply_gaussian_noise)
self.gauss_button.pack()

self.smooth_button = tk.Button(win, text="Lọc trung bình",


command=self.apply_smooth_filter)
self.smooth_button.pack()

self.median_button = tk.Button(win, text="Lọc trung vị",


command=self.apply_median_filter)
self.median_button.pack()

self.edge_detect_button = tk.Button(win, text="Tách biên",


command=self.apply_edge_detection)
self.edge_detect_button.pack()

def load_image(self):
path = filedialog.askopenfilename()
if path:
self.image = cv2.imread(path)
self.show_image(self.image, "Ảnh gốc")

def show_histogram(self):
if self.image is not None:
gray_image = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
plt.hist(gray_image.ravel(), 256, [0, 256])
plt.show()

def apply_gaussian_noise(self):
if self.image is not None:
noisy_image = self.image.copy()
mean = 0
stddev = 100
cv2.randn(noisy_image, mean, stddev)
noisy_image = cv2.add(self.image, noisy_image)
self.show_image(noisy_image, 'Ảnh nhiễu Gauss')

def apply_smooth_filter(self):
if self.image is not None:
smoothed_image = cv2.blur(self.image, (5, 5))
self.show_image(smoothed_image, 'Lọc trung bình')

def apply_median_filter(self):
if self.image is not None:
median_filtered_image = cv2.medianBlur(self.image, 5)
self.show_image(median_filtered_image, 'Lọc trung vị')

def apply_edge_detection(self):
if self.image is not None:
gray_image = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
kirschx = cv2.filter2D(gray_image, -1, np.array([[-3, -3, 5], [-3,
0, 5], [-3, -3, 5]]))
kirschy = cv2.filter2D(gray_image, -1, np.array([[-3, -3, -3], [-
3, 0, -3], [5, 5, 5]]))
kirsch = cv2.addWeighted(kirschx, 0.5, kirschy, 0.5, 0)
self.show_image(kirsch, 'Biên ảnh (Kirsch)')

def show_image(self, image, title):


image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (300, 300))
image_pil = Image.fromarray(image)
image_tk = ImageTk.PhotoImage(image_pil)

if hasattr(self, 'label'):
self.label.destroy()

self.label = tk.Label(self.win, image=image_tk)


self.label.image = image_tk
self.label.pack()

win = tk.Tk()
win.title("GIAO DIỆN XỬ LÝ ẢNH")
win.geometry('600x400')
app = ImageProcessingApp(win)
win.mainloop()

You might also like