Chúng ta sẽ tạo một chương trình đơn giản trong MATLAB để đếm số lượng LED từ một hình ảnh. Chương trình này sẽ có giao diện người dùng (GUI) và cho phép bạn tùy chỉnh thông tin cá nhân như tên và số học viên.
Đầu tiên, hãy xem cấu trúc chính của chương trình:
function led_counter
% Tạo cửa sổ GUI
fig = figure('Name','LED Counter v1.0', 'NumberTitle','off',...
'Position',[400 200 600 400]);
% Khu vực thông tin cá nhân
uicontrol('Style','text', 'Position',[420 300 150 20],...
'String','Tên: Nguyễn Văn A');
uicontrol('Style','text', 'Position',[420 270 150 20],...
'String','Số học viên: 20210001');
% Khu vực hiển thị hình ảnh
axes('Position',[0.1 0.2 0.6 0.6]);
% Nút chức năng
uicontrol('Style','pushbutton', 'Position',[420 200 100 30],...
'String','Tải hình ảnh', 'Callback',@load_image);
uicontrol('Style','pushbutton', 'Position',[420 150 100 30],...
'String','Bắt đầu đếm', 'Callback',@count_led);
end
Các đối tượng uicontrol được sử dụng để tạo các nút và ô văn bản. Tham số Position xác định vị trí và kích thước của các đối tượng này.
Tiếp theo, chúng ta sẽ xem phần xử lý hình ảnh, đây là phần quan trọng nhất của chương trình:
function count_led(~,~)
global img;
% Chuyển đổi sang hình ảnh xám
gray_img = rgb2gray(img);
% Binarization tự động
binary_img = imbinarize(gray_img, 'adaptive');
% Loại bỏ nhiễu bằng morphological opening
clean_img = imopen(binary_img, strel('disk', 3));
% Đếm số khu vực liên kết
[~, num] = bwlabel(clean_img);
% Hiển thị kết quả
subplot(1,2,2);
imshow(clean_img);
title(['Đếm được ', num2str(num), ' LED']);
end
Một số điểm kỹ thuật quan trọng:
imbinarizesử dụng ngưỡng tự động, giúp xử lý tốt hơn trong điều kiện ánh sáng khác nhau.imopenloại bỏ nhiễu nhỏ, làm sạch hình ảnh.bwlabelđếm số khu vực liên kết, tương ứng với số LED.
Để thay đổi thông tin cá nhân, bạn có thể sửa đổi các dòng sau:
% Trong phần khởi tạo GUI
set(findobj('Tag','name_text'), 'String','Tên của bạn');
set(findobj('Tag','id_text'), 'String','Số học viên của bạn');
Bạn nên đặt thuộc tính Tag cho các đối tượng uicontrol để dễ dàng bảo trì sau này, ví dụ:
uicontrol('Tag','name_text', ...);
uicontrol('Tag','id_text', ...);
Một số vấn đề có thể gặp phải:
- Hình ảnh nền phức tạp gây ra nhận dạng sai - thử điều chỉnh bán kính trong
strel('disk', 3). - Khoảng cách giữa các LED quá nhỏ - sử dụng
imdilateđể tách rời. - Ánh sáng phản chiếu gây quá phơi sáng - sử dụng bộ lọc phân cực khi chụp.
Cuối cùng, để tối ưu hóa, bạn có thể thêm thanh trượt để điều chỉnh ngưỡng và các tham số morphological:
uicontrol('Style','slider', 'Min',1,'Max',10,'Value',3,...
'Position',[420 100 100 30], 'Callback',@update_radius);
Với hàm callback:
function update_radius(src,~)
global radius;
radius = round(src.Value);
end
Chương trình này khoảng 200 dòng mã, phù hợp cho các dự án khóa học hoặc thực hành. Đảm bảo sử dụng MATLAB phiên bản 2016b trở lên để hỗ trợ các hàm mới.