1.2.1.1 Hàm mean - Hàm mean là hàm được sử dụng để tính giá trị trung bình số học average của một số dữ liệu nhất định.. - Hàm mean trả về giá trị trung bình số học mẫu của dữ liệu có th
THƯ VIỆN STATISTICS TRONG PYTHON
Tổng quan về thư viện Statistics trong Python
- Statistics là một mô-đun cung cấp các hàm tính toán thống kê toán học của dữ liệu số (có giá trị thực) Nó cung cấp các hàm để mô tả, tóm tắt và phân tích dữ liệu. Trừ khi được ghi chú rõ ràng, nếu không các hàm của Statistics sẽ hỗ trợ các kiểu dữ liệu int, float, Decimal, Fraction Mục đích của Statistics là nhằm vào trình độ vẽ đồ thị và máy tính khoa học.
- Khai báo thư viện để sử dụng: import statistics
THUẬT TOÁN HISTOGRAM EQUALIZATION
Giới thiệu về thuật toán Histogram Equalization
Biểu đồ Histogram là một dạng biểu đồ thống kê được sử dụng để biểu diễn phân phối của dữ liệu số hoặc dữ liệu liên tục thành các khoảng dữ liệu (bins) và thể hiện tần suất hoặc số lượng của các quan sát trong mỗi khoảng.Biểu đồ tần suất là một công cụ hữu ích trong nhiều lĩnh vực khác nhau, chẳng hạn như thống kê, khoa học dữ liệu, và quản lý chất lượng.
Phương pháp cân bằng biểu đồ (histogram equalization) là một kỹ thuật xử lý ảnh kỹ thuật số được sử dụng để cải thiện chất lượng hình ảnh Kỹ thuật này giúp tăng độ tương phản và giảm độ sáng của ảnh bằng cách thay đổi phân bố mức xám của ảnh.Histogram equalization hoạt động bằng cách phân tích biểu đồ histogram của hình ảnh và sau đó phân phối lại các giá trị cường độ của hình ảnh sao cho biểu đồ histogram của hình ảnh sau xử lý có dạng đồng đều.
Tại sao cần Histogram Equalization
- Để cải thiện độ tương phản của hình ảnh: Histogram Equalization có thể giúp cải thiện độ tương phản của các hình ảnh có độ tương phản thấp bằng cách phân phối lại các giá trị cường độ của hình ảnh sao cho hình ảnh rõ nét hơn.
- Để làm nổi bật các đặc điểm của hình ảnh: Histogram Equalization được sử dụng để làm nổi bật các đặc điểm của hình ảnh bằng cách tăng cường cường độ của các đặc điểm đó Ví dụ, sử dụng Histogram Equalization để cải thiện khả năng nhìn thấy các chữ trên một tờ giấy trắng.
- Để cải thiện chất lượng hình ảnh: Histogram Equalization có thể được sử dụng để cải thiện chất lượng ảnh bằng cách loại bỏ nhiễu và làm mờ.
Thuật toán Histogram Equalization
1 Tính toán histogram cho ảnh: tính toán histogram của ảnh đầu vào, là bảng tần suất của các mức xám có trong ảnh.
2 Tính toán hàm phân phối tích lũy cdf: tính toán hàm phân phối tích lũy cdf từ histogram Cdf là tổng tích lũy của tần suất đến một mức xám cụ thể Công thức tính cdf: cdf(i)=∑ j=0 i H(j)
M X Niϵ[0,255] trong đó cdf(i) là hàm phân phối tích lũy tại cấp độ độ sáng i, H(j) là giá trị histogram của ảnh tại cấp độ độ sáng j, N là số hàng (chiều cao) của ảnh, M là số cột (chiều rộng) của ảnh.
3 Chuẩn hóa histogram: chuẩn hóa giá trị của cdf để đưa chúng về khoảng
[0,1] Công thức chuẩn hóa cdf: h ' (x)= h(x) tổng số điểm ảnh trong đó h’(x) là cdf đã được chuẩn hóa, h(x) là giá trị cdf cần chuẩn hóa.
4 Tính giá trị cường độ mới cho mỗi pixel: giá trị cường độ mới của mỗi pixel được tính bằng cách lấy giá trị cdf tương ứng nhân với số mức xám tối đa ( thường là 255) để chuẩn hóa đến khoảng [0,255].
5 Áp dụng các giá trị cường độ mới vào từng pixel trong ảnh ban đầu.
Ví dụ về thuật toán Histogram Equalization
Hình 2.1 Ảnh trước và sau khi thực hiện cân bằng lược đồ tần số Histogram 1
Hình 2.2 Ảnh trước và sau khi thực hiện cân bằng lược đồ tần số Histogram 2
THUẬT TOÁN HISTOGRAM MATCHING
Giới thiệu về thuật toán Histogram Matching
Trong xử lý ảnh, histogram matching hay histogram specification là phương pháp biến đổi một ảnh sao cho histogram của nó phù hợp với histogram được chỉ định trước đó Phương pháp này hữu ích khi chúng ta muốn thống nhất mức độ tương phản của một nhóm ảnh Đối sánh biểu đồ là một kỹ thuật mạnh mẽ có thể được sử dụng để cải thiện giao diện của hình ảnh và làm cho chúng dễ xử lý hơn.
Tại sao cần Histogram Matching
- Nâng cao hình ảnh: Histogram Matching có thể được sử dụng để cải thiện độ tương phản và độ sáng của một hình ảnh.
- Chuẩn hóa hình ảnh: Histogram Matching được sử dụng để chuẩn hóa độ tương phản và độ sáng của một nhóm hình ảnh, giúp chúng dễ so sánh và xử lí hơn.
- Chuyển màu: Histogram Matching được sử dụng để chuyển bảng màu của một hình ảnh sang hình ảnh khác.
Thuật toán Histogram Matching
1 Tính toán biểu đồ của ảnh đầu vào và ảnh tham chiếu:
- Biểu đồ của một ảnh là một đồ thị thể hiện sự phân bố của các giá trị pixel trong ảnh đó Biểu đồ có thể được tính toán bằng cách đếm số lần mỗi giá trị pixel xuất hiện trong ảnh.
2 Tính hàm phân phối tích lũy của mỗi biểu đồ:
Hàm phân phối tích lũy (CDF) của một biểu đồ là một hàm cho biết xác suất một pixel có giá trị nhỏ hơn hoặc bằng một giá trị cụ thể CDF có thể được tính toán bằng cách tổng hợp biểu đồ từ trái sang phải.
3 Mapping cdf của ảnh đầu vào sang cdf của ảnh tham chiếu: Để biến đổi ảnh đầu vào thành ảnh có biểu đồ giống như ảnh tham chiếu, chúng ta cần tạo một bản đồ ánh xạ mỗi giá trị pixel của ảnh đầu vào sang một giá trị pixel trong ảnh tham chiếu Bản đồ này có thể được tạo bằng cách so sánh CDF của ảnh đầu vào với CDF của ảnh tham chiếu.
4 Sử dụng bản đồ để biến đổi giá trị pixel của ảnh đầu vào:
Giá trị pixel của mỗi pixel trong ảnh đầu vào được biến đổi thành giá trị pixel trong ảnh tham chiếu bằng cách sử dụng bản đồ đã tạo ở bước 3.
Ví dụ về thuật toán Histogram Matching
Hình 3.1 Ảnh gốc, ảnh tham chiếu và ảnh sau khi thực hiện Histogram Matching 1
Hình 3.2 Ảnh gốc, ảnh tham chiếu và ảnh sau khi thực hiện Histogram Matching 2
HIỆN THỰC THUẬT TOÁN
Hiện thực và giải thích source code chương 1 – Các hàm trong thư viện Statistics
4.1.1 Các hàm tính trung bình và đại lượng đo lường vị trí
- Source code: def mean_function(): a = statistics.mean([2, 3, 5, 5, 7]) b = statistics.mean([F(5,6), F(1,2), F(15,7)]) c = statistics.mean([D("4.5"), D("5.7"), D("3.475")]) print(a) print(b) print(c) print("mean: ") mean_function()
Định nghĩa một hàm mean_function() tính toán giá trị trung bình.
Sử dụng statistics.mean để tính giá trị trung bình.
Tạo biến a lưu kết quả giá trị trung bình của danh sách thứ nhất có kiểu dữ liệu các phần tử là int.
Tạo biến b lưu kết quả giá trị trung bình của danh sách thứ hai có các phần tử là phân số do import class ‘Fraction’ từ thư viện chuẩn ‘fractions’ và đặt tên ngắn gọn là ‘F’.
Tạo biến c lưu kết quả giá trị trung bình của danh sách thứ hai có các phần tử là số thập phân do import class ‘Decimal’ từ thư viện chuẩn
‘decimal’ và đặt tên ngắn gọn là ‘D’.
Việc sử dụng ‘fractions’ cho phép tính các phép toán liên quan đến phân số tránh hiện tượng làm tròn và mất độ chính xác, trong khi ‘decimal’ thích hợp cho các phép toán yêu cầu độ chính xác cao với số thập phân. Tùy vào yêu cầu và tính chất bài toán cần độ chính xác mà sử dụng
‘fractions’ và ‘decimal’ để tính giá trị trung bình.
Dùng lệnh print() lần lượt 3 biến a, b, c để in kết quả.
Gọi lại hàm mean_function() để in kết quả ra màn hình nếu muốn.
Hình 4.1 Kết quả chạy code hàm mean()
- Source code: def fmean_function(): a = statistics.fmean([2.5, 5.0, 15.7]) grades = [65, 78, 24, 98] weights = [0.20, 0.20, 0.30, 0.30] b = statistics.fmean(grades, weights) print(a) print(b) print("fmean: ") fmean_function()
Định nghĩa một hàm fmean_function() để chuyển đổi kiểu dữ liệu thành float và tính toán giá trị trung bình.
Sử dụng statistics.fmean để tính giá trị trung bình.
Tạo biến a lưu kết quả giá trị trung bình không có trọng số của danh sách thứ nhất có kiểu dữ liệu các phần tử là float.
Tạo biến grades lưu danh sách các phần tử 65, 78, 24, 98 và biến trọng số weights lưu danh sách các phần tử 0.20, 0.20, 0.30, 0.30.
Tạo biến b lưu kết quả giá trị trung bình của grades khi có trọng số weights.
Dùng lệnh print() lần lượt 2 biến a, b để in kết quả.
Gọi lại hàm fmean_function() để in kết quả ra màn hình nếu muốn.
Hình 4.2 Kết quả chạy code hàm fmean()
- Source code: def geometric_mean_function(): a = statistics.geometric_mean([25, 67, 43]) print(a) print("geometric_mean: ") geometric_mean_function()
Định nghĩa một hàm geometric_mean_function() tính toán giá trị trung bình hình học.
Sử dụng statistics.geometric_mean để tính giá trị trung bình hình học.
Tạo biến a lưu kết quả giá trị trung bình của danh sách các phần tử 25,
Dùng lệnh print() biến a để in kết quả.
Gọi lại hàm geometric_mean_function() để in kết quả ra màn hình nếu muốn.
Hình 4.3 Kết quả chạy code hàm geometric_mean()
- Source code: def harmonic_mean_function(): a = statistics.harmonic_mean([50, 90]) b = statistics.harmonic_mean([50, 90], weights=[10, 40]) print(a) print(b) print("harmonic_mean: ") harmonic_mean_function()
Định nghĩa một hàm harmonic_mean_function() tính toán giá trị trung bình hài hòa.
Sử dụng statistics.harmonic_mean để tính giá trị trung bình hài hòa.
Tạo biến a lưu kết quả giá trị trung bình không có trọng số của danh sách các phần tử 50, 90.
Tạo biến b lưu kết quả giá trị trung bình có danh sách trọng số weight=[10, 40] của danh sách các phần tử 50, 90.
Dùng lệnh print() lần lượt biến a, b để in kết quả.
Gọi lại hàm harmonic_mean_function() để in kết quả ra màn hình nếu muốn.
Hình 4.4 Kết quả chạy code hàm harmonic_mean()
- Source code: def median_function(): a = statistics.median([2, 4, 6]) b = statistics.median([2, 4, 6, 8]) print(a) print(b) print("median: ") median_function()
Định nghĩa một hàm median_function() tính toán giá trị trung vị.
Sử dụng statistics.median để tính giá trị trung vị.
Tạo biến a lưu kết quả giá trị trung vị của danh sách các phần tử có số lượng quan sát lẻ là 2, 4, 6.
Tạo biến b lưu kết quả giá trị trung vị của danh sách các phần tử có số lượng quan sát chẵn là 2, 4, 6, 8.
Dùng lệnh print() lần lượt biến a, b để in kết quả.
Gọi lại hàm median_function() để in kết quả ra màn hình nếu muốn.
Hình 4.5 Kết quả chạy code hàm median()
- Source code: def median_low_function(): a = statistics.median_low([2, 4, 6]) b = statistics.median_low([2, 4, 6, 8]) print(a) print(b) print("median_low: ") median_low_function()
Định nghĩa một hàm median_low_function() tính toán giá trị trung vị thấp.
Sử dụng statistics.median_low để tính giá trị trung vị thấp.
Tạo biến a lưu kết quả giá trị trung vị thấp của danh sách các phần tử có số lượng quan sát lẻ là 2, 4, 6.
Tạo biến b lưu kết quả giá trị trung vị thấp của danh sách các phần tử có số lượng quan sát chẵn là 2, 4, 6, 8.
Dùng lệnh print() lần lượt biến a, b để in kết quả.
Gọi lại hàm median_low_function() để in kết quả ra màn hình nếu muốn.
Hình 4.6 Kết quả chạy code hàm median_low()
- Source code: def median_high_function(): a = statistics.median_high([2, 4, 6]) b = statistics.median_high([2, 4, 6, 8]) print(a) print(b) print("median_high: ") median_high_function()
Định nghĩa một hàm median_high_function() tính toán giá trị trung vị cao.
Sử dụng statistics.median_high để tính giá trị trung vị cao.
Tạo biến a lưu kết quả giá trị trung vị cao của danh sách các phần tử có số lượng quan sát lẻ là 2, 4, 6.
Tạo biến b lưu kết quả giá trị trung vị cao của danh sách các phần tử có số lượng quan sát chẵn là 2, 4, 6, 8.
Dùng lệnh print() lần lượt biến a, b để in kết quả.
Gọi lại hàm median_high_function() để in kết quả ra màn hình nếu muốn.
Hình 4.7 Kết quả chạy code hàm median_high()
- Source code: def median_grouped_function(): a = statistics.median_grouped([43, 67, 67, 90]) b = statistics.median_grouped([2, 4, 4, 6, 8], interval=1) c = statistics.median_grouped([2, 4, 4, 6, 8], interval=2) print(a) print(b) print(c) print("median_grouped: ") median_grouped_function()
Định nghĩa một hàm median_grouped_function() tính toán giá trị trung vị nhóm.
Sử dụng statistics.median_grouped để tính giá trị trung vị nhóm.
Tạo biến a lưu kết quả giá trị trung vị nhóm không có khoảng cách giữa các nhóm (không có interval) của danh sách các phần tử 43, 67, 67, 90.
Tạo biến b lưu kết quả giá trị trung vị nhóm có khoảng cách giữa các nhóm là 1 (interval=1) của danh sách các phần tử 2, 4, 4, 6, 8.
Tạo biến c lưu kết quả giá trị trung vị nhóm có khoảng cách giữa các nhóm là 2 (interval=2) của danh sách các phần tử 2, 4, 4, 6, 8.
Dùng lệnh print() lần lượt biến a, b, c để in kết quả.
Gọi lại hàm median_grouped_function() để in kết quả ra màn hình nếu muốn.
Hình 4.8 Kết quả chạy code hàm median_grouped()
- Source code: def mode_function(): a = statistics.mode([43, 67, 67, 88, 88, 90]) b = statistics.mode(["hi", "hi", "hi", "ha", "ha", "hu"]) print(a) print(b) print("mode: ") mode_function()
Định nghĩa một hàm mode_function() tính toán giá trị yếu vị.
Sử dụng statistics.mode để tính giá trị yếu vị.
Tạo biến a lưu kết quả giá trị yếu vị của danh sách các phần tử là số.
Tạo biến b lưu kết quả giá trị yếu vị của danh sách các phần tử là chuỗi
Dùng lệnh print() lần lượt biến a, b để in kết quả.
Gọi lại hàm mode_function() để in kết quả ra màn hình nếu muốn.
Hình 4.9 Kết quả chạy code hàm mode()
- Source code: def multimode_function(): a = statistics.multimode('aabbbcccceeee') b = statistics.multimode(' ') print(a) print(b) print("multimode: ") multimode_function()
Định nghĩa một hàm multimode_function() tính toán giá trị nhiều yếu vị.
Sử dụng statistics.multimode để tính giá trị nhiều yếu vị.
Tạo biến a lưu kết quả giá trị nhiều yếu vị của chuỗi ‘aabbbcccceeee’.
Tạo biến b lưu kết quả giá trị nhiều yếu vị của một chuỗi có một ký tự khoảng trắng.
Dùng lệnh print() lần lượt biến a, b để in kết quả.
Gọi lại hàm multimode_function() để in kết quả ra màn hình nếu muốn.
Hình 4.10 Kết quả chạy code hàm multimode()
- Source code: def quantiles_function(): a = statistics.quantiles([1, 2, 3, 4, 5], n=4) print(a) print("quantiles: ") quantiles_function()
Định nghĩa một hàm quantiles_function() để chia dữ liệu thành các phân vị.
Sử dụng statistics.quantiles để chia dữ liệu thành các phân vị.
Tạo biến a lưu kết quả khi tính của danh sách các phần tử là 1, 2, 3, 4, 5 khi có đối số n=4.
Dùng lệnh print() biến a để in kết quả.
Gọi lại hàm quantiles_function() để in kết quả ra màn hình nếu muốn.
Hình 4.11 Kết quả chạy code hàm quantiles()
4.1.2 Các hàm đo lường độ biến thiên hay phân tán
- Source code: def pstdev_function(): a = statistics.pstdev([1.7, 3.2, 3.2, 4.25, 3.12]) print(a) print("pstdev: ") pstdev_function()
Định nghĩa một hàm pstdev_function() để tính độ lệch chuẩn tổng thể.
Sử dụng statistics.pstdev để tính độ lệch chuẩn tổng thể.
Tạo biến a lưu kết quả độ lệch chuẩn tổng thể của danh sách các phần tử 1.7, 3.2, 3.2, 4.25, 3.12.
Dùng lệnh print() biến a để in kết quả.
Gọi lại hàm pstdev_function() để in kết quả ra màn hình nếu muốn.
Hình 4.12 Kết quả chạy code hàm pstdev()
- Source code: def pvariance_function(): data = [1.7, 3.2, 3.2, 4.25, 3.12] a = statistics.pvariance(data) mu = statistics.mean(data) b = statistics.pvariance(data, mu) c = statistics.pvariance([D("13.5"), D("22.25"), D("33.5")]) d = statistics.pvariance([F(1,2), F(3,4), F(5,6)]) print(a) print(b) print(c) print(d) print("pvariance: ") pvariance_function()
Định nghĩa một hàm pvariance_function() để tính phương sai tổng thể.
Sử dụng statistics.pvariance để tính phương sai tổng thể.
Tạo biến data lưu danh sách các phần tử có kiểu dữ liệu int.
Tạo biến a lưu kết quả phương sai tổng thể với tham số data được truyền vào statistics.pvariance(data).
Tính giá trị trung bình data bằng hàm statistics.mean(data) rồi gán vào biến mu.
Tạo biến b lưu kết quả phương sai tổng thể của danh sách data khi có đối số mu đã tính trước đó truyền vào.
Tạo biến c lưu kết quả phương sai của danh sách có các phần tử là số thập phân do import class ‘Decimal’ từ thư viện chuẩn ‘decimal’ và đặt tên ngắn gọn là ‘D’.
Tạo biến d lưu kết quả phương sai tổng thể của danh sách có các phần tử là phân số do import class ‘Fraction’ từ thư viện chuẩn ‘fractions’ và đặt tên ngắn gọn là ‘F’.
Dùng lệnh print() lần lượt các biến a, b, c, d để in kết quả.
Gọi lại hàm pvariance_function() để in kết quả ra màn hình nếu muốn.
Hình 4.13 Kết quả chạy code hàm pvariance()
- Source code: def stdev_function(): a = statistics.stdev([1.75, 2.75, 3.5, 4.25]) print(a) print("stdev: ") stdev_function()
Định nghĩa một hàm stdev_function() để tính độ lệch chuẩn mẫu.
Sử dụng statistics.stdev để tính độ lệch chuẩn mẫu.
Tạo biến a lưu kết quả độ lệch chuẩn mẫu của danh sách các phần tử 1.75, 2.75, 3.5, 4.25.
Dùng lệnh print() biến a để in kết quả.
Gọi lại hàm stdev_function() để in kết quả ra màn hình nếu muốn.
Hình 4.14 Kết quả chạy code hàm stdev()
- Source code: def variance_function(): data = [1.7, 3.2, 3.2, 4.25, 3.12] a = statistics.variance(data) mu = statistics.mean(data) b = statistics.variance(data, mu) c = statistics.variance([D("13.5"), D("22.25"), D("33.5")]) d = statistics.variance([F(1,2), F(3,4), F(5,6)]) print(a) print(b) print(c) print(d) print("variance: ") variance_function()
Định nghĩa một hàm variance_function() để tính phương sai mẫu.
Sử dụng statistics.variance để tính phương sai mẫu.
Tạo biến data lưu danh sách các phần tử có kiểu dữ liệu int.
Tạo biến a lưu kết quả phương sai mẫu với tham số data được truyền vào statistics.variance(data).
Tính giá trị trung bình data bằng hàm statistics.mean(data) rồi gán vào biến mu.
Tạo biến b lưu kết quả phương sai mẫu của danh sách data khi có đối số mu đã tính trước đó truyền vào.
Tạo biến c lưu kết quả phương sai mẫu của danh sách có các phần tử là số thập phân do import class ‘Decimal’ từ thư viện chuẩn ‘decimal’ và đặt tên ngắn gọn là ‘D’.
Tạo biến d lưu kết quả phương sai mẫu của danh sách có các phần tử là phân số do import class ‘Fraction’ từ thư viện chuẩn ‘fractions’ và đặt tên ngắn gọn là ‘F’.
Dùng lệnh print() lần lượt các biến a, b, c, d để in kết quả.
Gọi lại hàm variance_function() để in kết quả ra màn hình nếu muốn.
Hình 4.15 Kết quả chạy code hàm variance()
4.1.3 Các hàm thống kê cho mối quan hệ giữa hai đầu vào
- Source code: def covariance_function(): x = [1, 2, 3, 4, 5, 6, 7, 8, 9] y = [1, 3, 5, 1, 3, 5, 1, 3, 5] a = statistics.covariance(x, y) print(a) print("covariance: ") covariance_function()
Định nghĩa một hàm covariance_function() để tính hiệp phương sai.
Sử dụng statistics.covarince để tính hiệp phương sai.
Tạo 2 danh sách chứa các phần tử cần tính toán và gán lần lượt vào x và y.
Tạo biến a lưu kết quả hiệp phương sai của 2 danh sách x và y.
Dùng lệnh print() biến a để in kết quả.
Gọi lại hàm covariance_function() để in kết quả ra màn hình nếu muốn.
Hình 4.16 Kết quả chạy code hàm covariance()
- Source code: def correlation_function(): time = [182, 366, 270, 1703, 10_777] km = [60, 208, 175, 790, 2_600] a = statistics.correlation(time, km) print(a) print("correlation: ") correlation_function()
Định nghĩa một hàm correlation_function() để tính hệ số tương quan.
Sử dụng statistics.correlation để tính hệ số tương quan.
Tạo 2 danh sách chứa các phần tử cần tính toán và gán lần lượt vào time và km.
Tạo biến a lưu kết quả hệ số tương quan của 2 danh sách time và km.
Dùng lệnh print() biến a để in kết quả.
Gọi lại hàm correlation_function() để in kết quả ra màn hình nếu muốn.
Hình 4.17 Kết quả chạy code hàm correlation()
- Source code: def linear_regression_function(): time = [2000, 2003, 2008, 2012, 2015] vd = [1, 2, 3, 4, 5] sl, inter = statistics.linear_regression(time, vd) a = round(sl * 2022 + inter) print(a) print("linear_regression: ") linear_regression_function()
Định nghĩa một hàm linear_regression_function() để tính độ dốc và giao điểm cho hồi quy tuyến tính.
Sử dụng statistics.linear_regression để tính độ dốc và giao điểm cho hồi quy tuyến tính.
Tạo 2 danh sách chứa các phần tử cần tính toán và gán lần lượt vào time và vd.
Tạo biến sl và inter lưu kết quả độ dốc và giao điểm cho hồi quy tuyến tính của 2 danh sách time và vd.
Sử dụng độ dốc và giao điểm để dự đoán giá trị tại năm 2022 rồi gán vào biến a.
Dùng lệnh print() biến a để in kết quả.
Gọi lại hàm linear_regression_function() để in kết quả ra màn hình nếu muốn.
Hình 4.18 Kết quả chạy code hàm linear_regression()
Hiện thực và giải thích source code chương 2 – Thuật toán Histogram Equalization
4.2.1 Thư viện được sử dụng trong thuật toán Histogram Equalization
4.2.1.1 Thư viện OpenCV (Open Source Computer Vision)
- Thư viện OpenCV là một thư viện mạnh mẽ cho xử lí hình ảnh và thị giác máy tính Thường được sử dụng để đọc, xử lí và hiển thị hình ảnh.
- Cách khai báo để sử dụng: import cv2
- Thư viện Numpy là một thư viện chuyên xử lí mảng và ma trận trong Python. Thường được sử dụng để thực hiện các phép toán số học và xử lí dữ liệu nhanh chóng.
- Cách khai báo để sử dụng: import numpy
- Thư viện Matplotlib là một thư viện được sử dụng để tạo ra các đồ thị và biểu đồ chất lượng cao Nó cung cấp một cách linh hoạt để hiển thị dữ liệu và kết quả của phép tính trong môi trường Python Mô-đun ‘pyplot’ từ thư viện Matplotlib được sử dụng để vẽ đồ thị và hình ảnh.
- Cách khai báo để sử dụng: import matplotlib.pyplot
4.2.2 Source code thuật toán Histogram Equalization import cv2 import numpy as np import matplotlib.pyplot as plt def import_image(path): return cv2.imread(path, cv2.IMREAD_GRAYSCALE) def create_histogram(img): histogram = np.zeros(256, dtype=int) for row in range(img.shape[0]): for col in range(img.shape[1]): histogram[img[row, col]] += 1 return histogram def equalization_histogram(img): histogram = create_histogram(img) cdf = np.zeros(256, dtype=int) for i in range(0, len(histogram)): cdf[i] = sum(histogram[:i]) sum_value = img.shape[0] * img.shape[1] min_value = min(cdf) cdf_normal = [int(((f-min_value)/(sum_value-min_value))*255) for f in cdf] equal_img = np.zeros_like(img) for i in range(img.shape[0]): for j in range(img.shape[1]): equal_img[i, j] = cdf_normal[img[i, j]] return equal_img name = input("Enter your link image: ") image = import_image(name) equalized_image = equalization_histogram(image) plt.subplot(2, 2, 1) plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB), cmap='gray') plt.title('Original Image') plt.subplot(2, 2, 2) plt.imshow(equalized_image, cmap='gray') plt.title('Equalized Image') plt.tight_layout() plt.show()
- Đầu tiên import lần lượt 3 thư viện OpenCV (import cv2), Numpy (import numpy as np: cho phép viết tắt numpy là np), Matplotlib (import matplotlib.pyplot as plt: cho phép viết tắt matplotlib là plt) để sử dụng.
- Định nghĩa hàm import_image(path) với tham số path truyền vào là đường dẫn của ảnh cần cân bằng và sử dụng OpenCV để đọc ảnh dưới dạng ảnh xám (grayscale).
- Định nghĩa hàm create_histogram(img) với tham số img truyền vào là ảnh xám để tạo histogram cho ảnh xám đầu vào Hàm được định nghĩa như sau:
Tạo một mảng có 256 phần tử, được khởi tạo giá trị ban đầu là 0 bằng câu lệnh ‘np.zeros(256, dtype=int)’ để lưu giữ giá trị tần suất của từng mức xám trong ảnh Mảng này được tạo bằng numpy và có kiểu dữ liệu là int và được gán vào biến histogram.
Dùng vòng lặp for để duyệt qua từng hàng của ảnh img bằng câu lệnh
‘for row in range(img.shape[0])’ ‘img.shape[0]’ là số hàng của ảnh Vị trí của hàng được gán vào biến row sau mỗi lần duyệt.
Tiếp tục dùng vòng lặp ‘for col in range(img.shape[1])’ lồng trong vòng lặp for duyệt hàng trước đó để duyệt qua từng cột của mỗi hàng.
‘img.shape[1]’ là số cột của ảnh Vị trí của cột được gán vào biến col sau mỗi lần duyệt.
Sau khi duyệt từng hàng và từng cột của mỗi hàng thì dùng câu lệnh
‘histogram[img[row, col]] += 1’ để tăng giá trị tần suất của mức xám tại vị trí ‘img[row, col]’ trong histogram lên 1 Cụ thể, giá trị mức xám tại vị trí ‘[row, col]’ trong ảnh được sử dụng làm chỉ số để tăng tần suất tương ứng trong histogram
Cuối cùng là trả về histogram đã được xây dựng sau khi duyệt qua toàn bộ ảnh bằng câu lệnh ‘return histogram’.
- Định nghĩa hàm equalization_histogram(img) với tham số img truyền vào là ảnh xám để thực hiện quá trình cân bằng lược đồ màu Hàm được định nghĩa như sau:
Đầu tiên sử dụng hàm create_histogram đã được định nghĩa ở trên để tạo histogram của ảnh xám img và lưu vào biến histogram.
Tạo một mảng có 256 phần tử, được khởi tạo giá trị ban đầu là 0 bằng câu lệnh ‘np.zeros(256, dtype=int)’ Mảng này được tạo bằng numpy và có kiểu dữ liệu là int và được gán vào biến cdf.
Duyệt qua histogram bằng câu lệnh ‘for i in range(0, len(histogram))’ khi cho biến i chạy từ 0 đến độ dài của histogram Trong vòng lặp sẽ tính toán cdf Cdf tại mỗi giá trị i được tính là tổng các giá trị trong histogram từ chỉ số 0 đến chỉ số i-1 qua câu lệnh ‘cdf[i] = sum(histogram[:i])’.
‘histogram[:i]’ là một phép cắt lấy một phần của danh sách histogram từ
Tiếp theo chuẩn hóa giá trị của cdf (hàm phân phối tích lũy) đưa chúng về khoảng giá trị từ 0 đến 255 để chuyển đổi giá trị của một ảnh giúp nó có thể xử lí hoặc hiển thị rõ ràng hơn bằng việc tạo biến sum_value tính tích của chiều cao (img.shape[0]) và chiều rộng (img.shape[1]) của ảnh, đại điện cho tổng số pixel trong ảnh img.shape sẽ trả về mảng có 3 phần tử [chiều cao, chiều rộng, chiều sâu] nên dùng ‘img.shape[0]’ và
‘img.shape[1]’ để tính Sau đó lấy giá trị nhỏ nhất trong danh sách cdf,đại diện cho giá trị tối thiểu của hàm phân phối tích lũy Kế đến, tính toán giá trị chuẩn hóa cho mỗi giá trị trong cdf bằng câu lệnh ‘((f- min_value)/(sum_value-min_value))*255’ Cụ thể, ‘(f-min_value)’ dịch chuyển giá trị để đảm bảo rằng giá trị nhỏ nhất của cdf sau khi trừ đi có giá trị tối thiểu là 0 ‘/(sum_value-min_value)’ chia cho phạm vi giá trị của cdf để đưa chúng về khoảng [0,1] ‘*255’ là nhân với 255 để đưa giá trị về khoảng giá trị từ 0 đến 255 Ép kiểu kết quả thành số nguyên do giá trị pixel thường là số nguyên trong phạm vi [0, 255] bằng lệnh int(…) ‘[… for f in cdf]’ cho phép áp dụng biểu thức tính toán được mô tả trước đó cho mỗi giá trị f trong danh sách cdf Cuối cùng, sau khi chạy đoạn mã này thì giá trị cdf đã được chuẩn hóa sẽ được gán vào biến cdf_normal.
Bước cuối cùng để định nghĩa hàm equalization_histogram là áp dụng cdf_normal (hàm phân phối tích lũy đã được chuẩn hóa) vào mỗi pixel của ảnh để tạo ra một ảnh mới với việc cân bằng histogram Cụ thể là tạo ra một mảng có kích thước giống như mảng img nhưng tất cả các giá trị trong mảng mới được đặt là 0 bằng câu lệnh ‘np.zeros_like(img)’ và gán vào equal_img Duyệt qua các dòng của ảnh bằng lệnh ‘for i in range(img.shape[0])’ Duyệt qua tiếp các cột trong mỗi hàng của ảnh bằng lệnh ‘for i in range(img.shape[1])’ lồng trong vòng lặp for duyệt hàng trước đó Gán giá trị tương ứng từ mảng cdf_normal vào mỗi pixel của ảnh img bằng câu lệnh ‘equal_img[i, j] = cdf_normal[img[i, j]]’. Hàm trả về equal_img là ảnh mới được cân bằng với mỗi giá trị pixel trong ảnh được thay thế bằng giá trị tương ứng từ hàm phân phối tích lũy đã được chuẩn hóa bằng câu lênh ‘return equal_img’.
- Sử dụng câu lệnh ‘name = input("Enter your link image: ")’ để yêu cầu người dùng nhập đường dẫn của ảnh cần thực hiện cân bằng và lưu trữ nó trong biến name.
- Sử dụng hàm import_image(name) được định nghĩa trước đó với tham số name truyền vào để đọc ảnh từ đường dẫn và gán vào biến image.
- Gọi hàm equalization_histogram(image) đã được định nghĩa với tham số image truyền vào để cân bằng histogram của ảnh image và lưu vào biến equalized_image.
- Sử dụng các câu lệnh của thư viện matplotlib để in ảnh.
- ‘plt.subplot(2, 2, 1)’ để chia cửa sổ hiển thị thành một lưới 2x2 và chọn ô thứ nhất.