Nghiêncứu về sự thay đổi trạng thái ban đầu của ảnh, với mục đích cải thiện thông tin ảnh trựcquan theo cách hiểu của con người, nén ảnh hoặc làm cho nó phù hợp với tri giác máy.Phần lớn
Trang 1PYTHON VÀ VẤN ĐỀ XỬ LÝ ẢNH
ĐỒÁNI Chuyên ngành: Toán tin Chuyên sâu: Tin học
Giảng viên hướng dẫn:
Sinh viên thực hiện:
Mssv:
Lớp:
Ts Nguyễn Thị Thanh Huyền
Vũ Thị Ánh Nguyệt 20195905
Toán tin 02 – K64
Trang 2………
………
………
2 Kết quả đạt được ………
………
………
………
3 Ý thức làm việc của sinh viên ………
………
………
………
Hà Nội, ngày… tháng… năm 2022
Giảng viên hướng dẫn (Ký và ghi rõ họ tên)
Trang 3I Hệ thống xử lý ảnh
II Những khái niệm cơ bản trong xử lý ảnh
1 Ảnh số và điểm ảnh
2 Độ phân giải hình ảnh
3 Mức xám của ảnh
4 Độ sâu màu của ảnh số
CHƯƠNG 3: XỬ LÝ ẢNH VỚI THƯ VIỆN OPENCV
I Làm quen với thư viện OpenCV
1 Đọc, hiển thị và lưu file ảnh
2 Cắt, xoay và thay đổi kích thước ảnh
II Cải thiện và nâng cấp ảnh
1 Toán tử trên điểm ảnh
1.1 Một số phép biến đổi cấp xám cơ bản
1.2 Cắt ngưỡng
1.3 Trích chọn bit
1.4 Histogram
2 Toán tử trên miền không gian
1.1 Lọc mịn ảnh
1.2 Lọc sắc nét ảnh
2 Toán tử trên miền tần số
3.1 Biến đổi Fourier
3.2 Lọc thông thấp (làm mịn ảnh)
3.3 Lọc thông cao (làm sắc nét ảnh)
III Khôi phục ảnh
1 Nhiễu trong ảnh
1.1 Khái niệm
Trang 41 Phân vùng ảnh dựa trên kỹ thuật cắt ngưỡng toàn cục
2 Phân vùng ảnh dựa trên thuộc tính vùng ảnh
2.1.1 Thuật toán nở vùng
2.1.2 Thuật toán tách và gộp các vùng ảnh
Tài liệu tham khảo:
Trang 5MỞ ĐẦU
CHƯƠNG 1: GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH PYTHON
Python là một ngôn ngữ lập trình bậc cao, đa năng do Guido van Rossum tạo ra và ramắt vào năm 1991 Python được nhiều lập trình viên lựa chọn sử dụng vì ưu thế dễđọc, dễ học và dễ nhớ Python được sử dụng rộng rãi trong phát triển trí tuệ nhân tạo
Ban đầu Python được phát triển để chạy trên nền Unix, nhưng về sau Python được phát triển sang mọi hệ điều hành từ MS – DOS đến MAC OS, OS/2, Windows, Linux…
Python được sử dụng rộng rãi trong nhiều lĩnh vực như: Lập trình web , Data Analysis( Machine Learning, Image and Video Analysis ), lập trình robot, lập trình game…
Với chủ đề về Xử lý ảnh, Python cung cấp cho chúng ta nhiều thư viện với nhiều tínhnăng hỗ trợ xử lý như: OpenCV, Scikit-image, PIL/pillow, Numpy, Mahotas
Trang 6Sobel; hay làm mịn ảnh với bộ lọc Gaussian cùng hàm gaussian()… cùng rất nhiềuthuật toán khác.
PIL/pillow
PIL là viết tắt của Python Image Library Đây là một trong những thư viện mạnh mẽ,
hỗ trợ nhiều định dạng hình ảnh như ppm, jpeg, tif, gif, png và bmp
Thư viện giúp chúng ta thực hiện nhiều thao tác trên hình ảnh như xoay, thay đổi kích thước, cắt xén,… thông qua nhiều hàm
Numpy
Với thư viện này ta có thể thao tác các kỹ thuật đơn giản như lật ảnh, trích xuất các tínhnăng và phân tích Trong thư viện, hình ảnh có thể được biểu diễn bởi các mảng đa chiều, vì vậy kiểu của chúng là NdArrays Với hình ảnh màu sẽ được thể hiện bởi mảng 3 chiều
Trang 7CHƯƠNG 2 : GIỚI THIỆU CHUNG VỀ XỬ LÝ ẢNH
Xử lý ảnh là một phân ngành trong xử lý số tín hiệu với tín hiệu xử lý là ảnh Nghiêncứu về sự thay đổi trạng thái ban đầu của ảnh, với mục đích cải thiện thông tin ảnh trựcquan theo cách hiểu của con người, nén ảnh hoặc làm cho nó phù hợp với tri giác máy.Phần lớn các chức năng xử lý ảnh cho ra một hình ảnh mới, đã được can thiệp Các phương pháp xử lý ảnh dựa trên các ứng dụng chính: xử lý nâng cao chất lượng ảnh, phân tích ảnh Dưới đây là hệ thống xử lý ảnh mô tả các bước trong quá trình xử lý ảnh:
Hình 2.1 Hệ thống xử lý ảnh Thu nhận ảnh, chụp ảnh và số hóa ảnh
Đây là công đoạn đầu tiên của quá trình xử lý ảnh, ảnh được thu nhận thông qua các thiết bị như camera, sensor, scanner,… các tín hiệu sau đó sẽ được số hóa Các thông
số quan trọng của bước này đó là độ phân giải, chất lượng màu, dung lượng bộ nhớ vàtốc độ thu nhận ảnh của các thiết bị
Trang 8Giai đoạn này ta tiến hành các bước như: cải thiện nâng cấp ảnh, sửa lỗi, khôi phụcảnh; phân tách đặc trưng: tách biên, phân vùng ảnh; biểu diễn và xử lý đặc trưng hìnhdạng đối tượng ảnh; nhận dạng đối tượng ảnh, phân tích cảnh và hiểu cảnh.
Sau khi kết thúc bước Thu nhận ảnh, chụp ảnh và số hóa ảnh , ta sẽ đi vào giai đoạn
tiền xử lý Ở bước này, chất lượng ảnh sẽ được cải thiện tốt hơn về độ tương phản, khửnhiễu, khử bóng, khử độ lệch,…, chuẩn bị cho các bước xử lý sâu sau đó
Phân vùng ảnh (hay phân đoạn) là tách ảnh đầu vào thành các vùng thành phần có cùng tính chất nào đó dựa theo biên hay các vùng liên thông
Việc chọn các tính chất để thể hiện ảnh gọi là trích chọn đặc trưng (Feature Selection) gắn với việc tách các đặc tính của ảnh dưới dạng các thông tin định lượng hoặc làm cơ
sở để phân biệt lớp đối tượng này với đối tượng khác trong phạm vi ảnh nhận được Vídụ: trong nhận dạng ký tự trên phong bì thư, chúng ta miêu tả các đặc trưng của từng
ký tự giúp phân biệt ký tự này với ký tự khác
Mỗi ảnh gốc hay còn gọi là ảnh tự nhiên, là ảnh liên tục về không gian và độ sáng Để
có thể xử lý ảnh, ta cần phải số hóa ảnh gốc đó, tức là biến đổi gần đúng một ảnh liên tục thành một tập điểm phù hợp với ảnh đó về vị trí và độ sáng Mỗi điểm như vậy
được gọi là một điểm ảnh ( picture element) viết tắt là pixel Khoảng cách giữa các
pixel được thiết lập sao cho mắt người nhìn bình thường không phân biệt được ranh giới giữa chúng
Trang 9Hình 2.2 Ảnh số
Như vậy, xét về mặt toán học, ảnh số là một hàm hai biến f(x,y) , với x, y là các tọa độ.Mỗi điểm có tọa độ (x,y) là một pixel, giá trị số tại điểm (x,y) đó chính là giá trị xám( sẽ được trình bày sau), giá trị đó là hữu hạn : 0 ≤ f(x,y) ≤
2 Độ phân giải hình ảnh
Độ phân giải hình ảnh ( image resolution ) chỉ lượng thông tin được chứa đựng trong
một tập tin ảnh hiển thị trên màn hình Hay nói cách khác đó là số điểm (pixel) trongmột hình ảnh số
Rõ ràng, độ phân giải càng thấp thì ảnh càng mờ:
Trang 10Mỗi điểm ảnh có hai đặc trưng cơ bản là vị trí (x,y) của nó và độ xám f(x,y).
Mức xám của điểm ảnh là là kết quả của sự biến đổi tương ứng 1 giá trị độ sáng của 1 điểm ảnh với 1 giá trị nguyên dương Thông thường nó xác định trong đoạn [0,255] tùythuộc vào giá trị mà mỗi điểm ảnh được biểu diễn
Các thang giá trị mức xám thông thường là: 16, 32, 64, 128, 256 Mức 256 là mức phổbiến nhất
4 Độ sâu màu của ảnh số
Độ sâu màu của ảnh số là đại lượng mô tả khả năng biểu diễn các màu sắc trong ảnh
số khi thể hiện trên các thiết bị màn hình hoặc in ấn Đó chính là thông số thể hiện sốlượng các bit được sử dụng để biểu thị màu sắc của mỗi pixel
Từ đó ta phân biệt 3 loại ảnh: ảnh nhị phân, ảnh xám và ảnh màu:
Trang 11Ảnh nhị phân (binary image) là ảnh đen trắng, mỗi pixel chỉ có 1 giá trị 0 hoặc 255,
dùng 1 bit để biểu diễn một pixel
Hình 2.4 Ảnh nhị phân
Ảnh xám ( gray image) là ảnh có mô hình màu đơn sắc với 256 cấp độ xám biến thiên từ
đen đến trắng, mỗi pixel có 1 giá trị từ 0 đến 255, dùng 8 bit để biểu diễn một pixel
Hình 2.5 Ảnh xám
Khi biểu diễn ảnh nhị phân hay ảnh xám, ta chỉ cần một ma trận m x n, mỗi phần tửcủa ma trận là giá trị xám của một pixel
Trang 12Ảnh màu là ảnh thông thường ta hay nhìn thấy nhất, ở đây ta sẽ xét ảnh theo mô hình
RGB: ánh sáng đỏ, ánh sáng xanh lục và ánh sáng xanh lam được tổ hợp với nhau theonhiều phương thức khác nhau để tạo thành nhiều màu khác nhau Mỗi pixel của ảnh màu có 3 giá trị xám tương ứng là giá trị của màu đỏ (R), giá trị của màu xanh lục (G)
và giá trị của màu xanh lam ( B), mỗi giá trị là số nguyên nằm trong đoạn [0,255] Ta dùng 24 bit ( 3 byte) để biểu diễn một pixel
Khi biểu diễn một ảnh màu, sẽ có dạng nhau sau:
Để tiện cho việc lưu trữ và xử lý ta sẽ tách ma trận trên ra thành 3 ma trận tương ứngcủa màu đỏ, xanh lam và xanh lục
Trang 13CHƯƠNG 3: XỬ LÝ ẢNH VỚI THƯ VIỆN OPENCV
Để tiến hành thực hiện được các bộ lọc, thuật toán trong xử lý ảnh thì ba thao tác đọc,hiện thị và lưu file ảnh nắm vai trò quan trọng và tối thiểu
Hình ảnh sau được sử dụng để thao tác trong phần này:
Hình 3.1 Ảnh mẫu
Trước tiên ta sẽ đưa ra đoạn code thực hiện cả ba chức năng trên:
# import thư viện opencv
import cv2
# Hàm cv2.imread() được dùng để đọc ảnh
img_anh1 = cv2.imread( 'anh1.jpg' , 1 )
# Hàm namedWindow() thay đổi kích thước cửa sổ
Trang 14# Hàm cv2.imshow được dùng để hiển thị ảnh trên cửa
sổ cv2.imshow( 'first image' , img_anh1)
# Hàm waitKey() chỉ định thời gian của sổ hiển thị
Để đọc ảnh đầu vào ta sử dụng hàm imread() của OpenCV với cú pháp :
imread( ‘filename’ , flags )
Với 2 đối số đầu vào:
đang thực thi, nếu không thì cần có đường dẫn đầy đủ đến tệp chứa ảnh
phổ biến được cung cấp bởi OpenCV:
o cv2.imread_unchanged hoặc -1: Tải hình ảnh bao gồm kênh alpha (có chế độ trong suốt)
o cv2.imread_grayscale hoặc 0: Tải hình ảnh ở chế độ xám
o cv2.imread_color hoặc 1: Tải hình ảnh màu và bỏ qua chế độ trong suốt
Đây là giá trị mặc định của đối số này
Trang 15Ta có thể truyền tên đầy đủ hoặc số thay thế cho đối số, tùy mục đích khác nhau mà ta
sẽ sử dụng giá trị khác nhau
Hình 3.2 Của sổ ảnh kết quả
Lưu ý với thư viện OpenCV sẽ đọc hình ảnh màu ở định dạng BGR, trong khi hầu hếtcác thư viện thị giác máy tính khác sử dụng định dạng kên RGB Vì vậy khi sử dụng OpenCV với các bộ công cụ khác cần có chuyển đổi kênh màu để đảm bảo ảnh không
bị sai lệch màu
Hiển thị hình ảnh
Ta sử dụng àm imshow() để hiển thị ảnh trong cửa sổ với cú pháp:
imshow( ‘window_name’, image)
Gồm 2 đối số:
Trang 16Hàm waitKey() là một hàm liên kết bàn phím:
được nhấnHàm destroyAllWindows() sẽ hủy tất cả cửa sổ đã tạo ra, nếu chỉ cần hủy một cửa sổnào đó, thì ta lấy tên cửa sổ đó làm đối số truyền vào cho hàm
Ngoài ra, ta có thay đổi kích thước cửa sổ hiển thị với hàm namedWindow(‘windowname’, flags), flags có thể là WINDOW_AUTOSIZE (mặc định) hoặc WINDOW_NORMAl (có thể thay đổi kích thước cửa sổ bằng việckéo/thả)
Lưu (ghi) hình ảnh
Ta sử dụng hàm imwrite() với cú pháp:
imwrite( ‘filename’, image )
Trang 17Với hai đối số:
Hàm trả về giá trị True nếu ảnh được lưu thành công
Trước tiên ta sử dụng đoạn code sau để xem kích thước của ảnh đầu vào:
rows , cols , _ = img_anh1.shape
print ( "Rows" , rows)
print ( "Cols" , cols)
Trang 18Hình sau mô tả chọn vùng bị cắt:
Hình 3.3 Mô tả ảnh cắt
Dựa trên kích thước đã xem trước đó mà ta chọn các giá trị x, y theo vùng cần cắt chophù hợp
Ví dụ: Sau khi thực hiện đoạn code sau:
# import thư viện opencv
import cv2
# Hàm cv2.imread() được dùng để đọc ảnh
img_anh1 = cv2.imread( 'anh1.jpg' , 1 )
# Cắt ảnh
Trang 19roi = img_anh1[ 500 : 700 , 400 : 560 ] cv2.imshow( 'Region Of Interest' , roi)
# Hàm waitKey() chỉ định thời gian của sổ hiển thị
OpenCV cung cấp hàm getRotationMatrix2D() để xác định ma trận xoay, với cú pháp:
getRotationMatrix2D(center, angle, scale)
với 3 đối số:
Trang 20 angle: góc quay (theo độ), nếu là số dương thì hình ảnh sẽ quay theo hướng nguowjwc chiều kim đồng hồ và ngược lại
khai báo, có thể là một giá trị dấu phẩy động Ví dụ 1.0 sẽ giữ ảnh đầu ra cùng kích thước ảnh gốc, giá trị 2.0 làmảnh ra gấp đôi kích thước ảnh gốc
Bước cuối cùng nhân hai ma trận để tạo ra ảnh xoay, đây chính là phép biến đối affine
và thư viện OpenCV cũng cấp hàm warpAffine() để thực hiện phép biến đối này, với
mặc định là 0
Ví dụ chạy đoạn code sau :
# import thư viện opencv
import cv2
Trang 21cv2.imshow( 'rotated image' , rotated)
# Hàm waitKey() chỉ định thời gian của sổ hiển thị
Trang 22Hình 3.5 Ảnh sau khi xoay
Thay đổi kích thước ảnh
Để thay đổi kích thước ảnh, OpenCV cung cấp hàm resize() với cú pháp:
# import thư viện opencv
import cv2
# Hàm namedWindow() thay đổi kích thước cửa sổ
Trang 23img_anh1 = cv2.imread( 'anh1.jpg' , 1 )
# Lấy kích thước ảnh gốc
(h , w , d) = img_anh1.shape
r = 700.0 / w img_resize = cv2.resize(img_anh1 , ( 700 , int (h * r)))
# Hàm cv2.imshow được dùng để hiển thị ảnh trên cửa
sổ cv2.imshow( 'resized image' , img_resize)
# Lấy kích thước ảnh mới
rows , cols , _ = img_resize.shape
print ( "Rows" , rows)
print ( "Cols" , cols)
# Hàm waitKey() chỉ định thời gian của sổ hiển thị
cv2.waitKey( 0 )
# cv2.destroyAllWindows() xóa tất cả cửa sổ đã tạo
cv2.destroyAllWindows()
Ta thu được ảnh:
Trang 24Hình 3.6 Ảnh thay đổi kích thước
Có kích thước:
Đảo ảnh với ảnh có các giá trị xám trong vùng [0, L-1] là thao tác xử lý trên điểm ảnh
có dạng:
s = ( L - 1) – rTrong đó s là điểm ảnh đã xử lý rồi, r là điểm ảnh ban đầu, L là mức xám cực đại Đoạn code sau thực hiện việc đảo ảnh sử dụng thư viện OpenCV:
# import thư viện opencv
import cv2
Trang 25# Hàm namedWindow() thay đổi kích thước cửa sổ
cv2.imshow( 'Image Negatives' , img_anh2)
# Hàm waitKey() chỉ định thời gian của sổ hiển thị
cv2.waitKey( 0 )
# cv2.destroyAllWindows() xóa tất cả cửa sổ đã tạo
cv2.destroyAllWindows()
Kết quả:
Trang 26Hình 3.7 Đảo ảnh
Ảnh sau khi đảo còn được gọi là ảnh âm bản
Sử dụng thuật toán trên với ảnh xám, ta thu được kết quả như sau:
Hình 3.8 Đảo ảnh xám
Trang 27Ảnh âm bản được ứng dụng trong nhiều lĩnh vực, hữu ích trong việc cải thiện các chitiết màu trắng hay màu xám nằm triong vùng tối.
Biến đổi ảnh bằng hàm Logarit là thao tác xử lý điểm ảnh có dạng :
s = c.log ( 1 + r )trong đó, r là điểm ảnh đầu vào, c là hằng số, s là điểm ảnh đã xử lý
import cv2 as cv
import matplotlib.pyplot as plt
def Chuyen_doi_logarit (img , c):
return float (c) * cv.log( 1.0 + img)
def show_Chuyen_doi_logarit ():
fig = plt.figure( figsize =( 16 , 9 )) ax1 , ax2 = fig.subplots( 1 , 2 )
img = cv.imread( 'anh1.jpg' )
ax1.imshow(img , cmap = 'gray' ) ax1.set_title( "Ảnh gốc" )
Trang 28if name == ' main ' : show_Chuyen_doi_logarit()
Kết quả:
Hình 3.9 Ảnh biến đổ Logarit
Biến đổi ảnh bằng hàm Logarit là thao tác xử lý điểm ảnh có dạng :
s = c
Trong đó, r là điểm ảnh đầu vào, c và γ là hằng số, s là điểm ảnh đầu ra
import cv2 as cv
import matplotlib.pyplot as plt
def Chuyen_Doi_Gamma (img , gamma , c):
return float (c) * pow (img , float (gamma))
Trang 29y1 = Chuyen_Doi_Gamma(img , 0.6 , 1.0 ) ax2.imshow(y1 , cmap = 'gray' )
ax2.set_title( "gamma=0.6" )
y2 = Chuyen_Doi_Gamma(img , 0.3 , 1.0 ) ax3.imshow(y2 , cmap = 'gray' )
ax3.set_title( "gamma=0.3" )
y3 = Chuyen_Doi_Gamma(img , 0.1 , 1.0 ) ax4.imshow(y3 , cmap = 'gray' )
ax4.set_title( "gamma=0.1" ) plt.show()
if name == ' main ' : show_Chuyen_Doi_Gamma()
Trang 30Hình 3.10 Ảnh biến đổi gamma
1.2 Cắt ngưỡng
Cắt ngưỡng là việc đưa ảnh đa cấp xám về hai mức giá trị xám
Ta sẽ chọn ra một giá trị ngưỡng cụ thể T để từ đó tiến hành cắt ngưỡng như sau: ta sosánh các giá trị xám tại mỗi pixel với giá trị ngưỡng T, nếu giá trị đó nhỏ hơn T thì ta chuyển giá trị xám đó về 0; còn nếu giá trị xám lớn hơn T thì chuyển về giá trị (L - 1)
Ta có thể quan sát đồ thị sau:
Trang 31Trong đó:
r là các pixel của ảnh ban đầu
S là các pixel của ảnh sau khi cắt ngưỡng
Với th = 117 ta thu được kết quả như sau:
Hình 3.12 Hình cắt ngưỡng
Trang 32Mỗi điểm ảnh của ảnh 8 bit được biểu diễn bằng 8 mặt phẳng bit từ 1 đến 8, xếp chồng
lên nhau theo thứ tự từ cao đến thấp (bit số 8 ở trên cùng, bit 1 ở dưới cùng) Những
mặt phẳng phía trên sẽ chứa nhiều dữ liệu ý nghĩa của ảnh và những mặt phẳng phía
dưới chứa chủ yếu dữ liệu chi tiết ảnh
Kỹ thuật lát cắt mặt phẳng bit là kỹ thuật sử dụng các phép toán trên điểm ảnh để chia
ảnh đa cấp xám thành nhiều ảnh nhị phân, cho phép xác định những mặt phẳng bit
quan trọng và số lượng bit yêu cầu của quá trình lượng tử hóa
Ta có thể mô tả các bước của kỹ thuật này với ví dụ về ảnh 3 bit như sau:
Bước 1: Chuyển ảnh n bit sang ma trận mà mỗi phần tử của ma trận là một chuỗi n bit
Trang 34Bước 3: Tái tạo lại ảnh, chuyển các ảnh nhị phân thành ảnh đa cấp xám tương ứng theocông thức:
#Khởi tạo danh sách
lst = []
for i in range (img.shape[ 0 ]):
for j in range (img.shape[ 1 ]):
lst.append(np.binary_repr(img[i][j] , width = 8 )) # width: số bit
Trang 35Bước 2: Sau khi có một danh sách chứa chuỗi các bit, ta sẽ lặp qua chuỗi các phân tửbit để tạo ra các mặt phẳng bit, rút chích và lưu vào từng danh sách
Ví dụ rút chích mặt phẳng bit thứ 8:
#Khởi tạo danh sách mặt phẳng bit
mp_bit_8 =[]
for i in lst:
mp_bit_8.append( int (i[ 0 ]))
Tương tự, để lấy phần tử của mặt phẳng thứ 7 ta sẽ truy cập vào phần tử i[1], mặtphẳng thứ 6 là i[2],…
Bước 3: Tái tạo lại ảnh từ các ảnh nhị phân
# Nhân từng phần tử với 2^(n-1) để có ảnh tái tạo tương ứng với mỗi mặt phẳng bit
(np.array(mp_bit_8 , dtype = 'uint8' )* 128 ).reshape(img.shape[ 0 ] , img.shape[ 1 ])
Tương tự với các mặt phẳng còn lạiKết quả thu được:
Trang 37Hình 3.14 Kết hợp 2 mặt phẳng bit
1.4 Histogram
Histogram của ảnh hay còn gọi là lược đồ xám cho thấy phân bố mức xám trên ảnh
Đặt h( ) = là tổng số pixel có cùng giá trị mức xám Khi đó h( ) được gọi là Histogram không chuẩn hóa Đặt p( ) = h( )/ (M*N) :
Ví dụ ta có ma trận ảnh 8 x 8 sau:
Trang 39Nhận xét:
Từ đó ta có ứng dụng cân bằng Histogram của ảnh để tăng cường ảnh
Các bước của kỹ thuật cân bằng Histogram:
Ví dụ: Cân bằng Histogram của một ảnh 3 bit, với mức xám L = 8, ảnh có kích thước
64 x 64 pixel, với giá trị mức xám như trong bảng sau:
=1
0 =0
Trang 40để cân bằng histogram của ảnh, có cú pháp:
equalizeHist(src)Trong đó, src là ảnh cần cân bằng
Ta cũng có thể vẽ được biểu đồ Histogram thông qua thư viện matplotlib với câu lệnh:
hist(src)Kết quả thu được như sau: