Chương III: XÂY DỰNG CHƯƠNG TRÌNH THỬ NGHIỆM
III.2. Thiết kế chương trình
- Cấu trúc vùng nhớ lưu ảnh:
Ảnh đầu vào là ảnh đa cấp xám dạng *.jpg, sau khi đƣợc tải vào bộ nhớ sẽ đƣợc giải mã và chuyển sang dạng ma trận điểm ảnh (quá trình này đƣợc thực hiện tự động khi sử dụng hàm đọc ảnh trong matlab).
*.jpg Gray Image
Lọc và làm trơn nhiễu
Phân tích cấu trúc vật lý
Ảnh ra đã khoanh vùng vă bản và đồ họa Tùy chọn FS
hoặc Top-down
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Như vậy về mặt logic thì cấu trúc vùng nhớ sử dụng để lưu ảnh là một mảng hai chiều Im x n có kích thước (m x n) phần tử.
Image = { I[i,j], i = 1..m, j = 1..n}
Trong đó I[i,j] là giá trị độ xám của điểm ảnh tương ứng với tọa độ (i,j) trong ảnh
Thông thường với ảnh đa cấp xám thì giá trị độ xám của mỗi điểm ảnh nằm trong khoảng [0..255], như vậy kích thước tối thiểu cho mỗi I[i,j] là 1Byte.
Chương trình sẽ sử dụng mảng có thuộc tính như sau để lưu trữ ảnh:
- Mảng I hai chiều với I[i,j] kiểu Byte (Max(I[i,j])=255)
- Kích thước của mảng là m x n với m là chiều cao của ảnh, n chiều rộng của ảnh và m, n kiểu Double (max(m/n)=232)
36 26 80 60 90 15 14 53 81 65 16 49 85 65 73 18 8 68 71 27 28 35 93 39 7 12 96 1 29 10 35 64 85 22 68 91 69 33 44 52 63 80 30 89 18 93 60 58 97 98 89 11 40 17 15 8 15 22 42 98 34 92 87 79 72 44 35 39 39 24 86 50 56 45 87 92 19 27 46 53 11 94 52 54 83 71 98 7 72 64 27 41 58 31 26 60 37 18 4 56 4 91 86 79 11 73 14 96 19 7 13 75 2 21 50 38 57 91 19 3 22 50 65 97 81 50 30 7 76 86 87 74 82 18 81 81 60 21 88 59 92 8 66 49 71 95 72 76 61 26 33 55 25 80 91 72 Ảnh
Ma trận điểm ảnh
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
48 GVHD: PGS. TS. Ngô Quốc Tạo - Cấu trúc lưu trữ lược đồ xám (kết quả của các phép chiếu nghiêng).
Phép chiếu nghiêng là đi tính tổng các điểm đen theo phương vuông góc với hướng chiếu. Kết quả của phép chiếu sẽ được lưu trữ vào một mảng một chiều H có kích thước d phần tử. Trong dó H[i] (với i = [1..d]) là tổng số điểm đen của cột thứ i theo phương chiếu.
III.2.2. Module chuẩn hóa ảnh
Thuật toán FS tính giá trị FS cho từng khối Block trong ảnh, vì thế cần phải chia ảnh thành các block có kích thước bằng nhau trước khi thực hiện thuật toán. Giả thiết kích thước của mỗi Block là (k x q), để việc tính FS cho các block không gặp trường hợp đặc biệt (Kích thước ảnh không bằng nguyên lần của Block) ta sẽ nối thêm vào chiều ngang và dọc của ảnh vùng nền đủ để sao cho kích thước ảnh mới bằng một số nguyên lần của Block.
.. .. .. .. .. .. 1 Byte
m (Double)
n (Double)
Ảnh I
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
49 GVHD: PGS. TS. Ngô Quốc Tạo
Giải thuật:
Input:
- Ảnh I có kích thước m x n
- Block có kích thước k x q (k,q<m,n)
Output: Ảnh I có kích thước m’ x n’ sao cho m’ = i*k và n’ = j*q (với i,j € N) Thuật toán:
B1: Tính m’
Nếu (m/k = nguyên (m/k)) thì m’=m;
Trái lại m’ = nguyên (m/k))*k + k;
B2: Tính n’
Nếu (n/q = nguyên (n/q)) thì n’=n;
Trái lại n’ = nguyên (n/q))*q + q;
Mã nguồn
(Mã nguồn cho module chuẩn hóa cài đặt trong Matlab) Ảnh gốc
Phần dƣ không đủ 1 block
Phần nền bổ xung cho đủ 1 block Block
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
% chuan hoa kich thuoc anh the nguyen lan cua NxN
%chuan chieu cao anh
if (chieucao/N)>round(chieucao/N) chieucao=round(chieucao/N)*N+N;
else
chieucao=round(chieucao/N)*N;
end
%chuan chieu rong anh if (chieurong/N)>round(chieurong/N) chieurong=round(chieurong/N)*N+N;
else
chieurong=round(chieurong/N)*N;
end
%%%%%%%%%%%%%%%%%%%%
Luận văn tốt nghiệp cao học Học viên: Nguyễn Văn Huy
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
51 GVHD: PGS. TS. Ngô Quốc Tạo III.2.3. Module giao diện chính
Giao diện chính đƣợc thiết kế đơn giản với một số chức năng chính nhƣ sau:
Vùng hiển thị ảnh gốc Vùng hiển thị ảnh kết quả
Chọn ảnh mới
Chọn phân tích kiểu Top-down
Chọn phân tích kiểu FS
Mô phỏng FS
Hình 33: Giao diện chính
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
52 GVHD: PGS. TS. Ngô Quốc Tạo
Mã nguồn:
Một số mã nguồn sự kiện cho các Button chính trên giao diện chính (cài dặt trong Matlab)
- Button chọn ảnh:
- Button Top-Down
- Button Fractal Signature
III.2.4. Module phân tích Top-down (TD)
Thuật toán phân tích TD đƣợc thiết kế theo kiểu đệ quy, và cần tham số chiều cao của font chữ. Để tính chiều cao của font chữ có 2 giải pháp
- Một là cho phép người sử dụng nhập vào.
- Hai là tự động dò theo thuật toán sau:
B1: Tính lược đồ chiếu nghiên theo phước thẳng đứng
B2: Tìm độ rộng xuất hiện nhiều nhất của các “cột” trong lƣợc đồ chiếu nghiêng, đây xấp xỉ bằng chiều cao của font chữ.
function pushbutton3_Callback(hObject, eventdata, handles) imshow('anhmau\running.jpg')
pause(0.5)
filename=get(handles.path,'string');
Fsign % Gọi chương trình con Fractal signature clear all
function pushbutton2_Callback(hObject, eventdata, handles) imshow('anhmau\running.jpg')
pause(0.5)
filename=get(handles.path,'string');
topdown % Gọi chương trình con TOPDOWN clear all
function pushbutton1_Callback(hObject, eventdata, handles)
% Hop thoai chon uong dan?
[fname,pname] = uigetfile('*.jpg','Hay chon mot anh da cap xam');
if fname~=0 % da chon 1 file
set(handles.path,'String',[pname,fname]); % hien thi duong dan cua file anh axes(handles.anhgoc);
imshow([pname,fname]);
axes(handles.anhdich);
end
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
53 GVHD: PGS. TS. Ngô Quốc Tạo Trong đề tài này việc xác định chiều cao được dò tự động theo phương pháp trên.
Giải thuật Top-Down
Input: Ảnh đa cấp xám I kích thước m x n, chiều cao font chữ k Output: Ảnh đã đƣợc phân đoạn văn bản và đồ họa.
Thuật toán:
Proceduce Topdown (I,x,y,m,n,k) // I là ảnh đầu vào, m và n là kích thước vùng ảnh // k chiều cao font chữ
// x,y là tọa độ hàng và cột // của điểm ảnh góc trái trên cùng Begin
B1: Tính lƣợc đồ chiếu đứng cho ảnh I đƣợc kết quả là mảng A gồm m phần tử B2: Xác định các “cột” trên lƣợc đồ A
For (mỗi cột(i) trong lƣợc đồ A) do IF độ rộng cột(i) ≈ k then
Khoanh vùng trên ảnh tại vị trí của cột(i) chiều dài n là vùng văn bản;
Else
IF độ rộng côt(i) > k then Thuật toán phân tích TD đƣợc thiết kế theo kiểu đệ quy, và cần tham số chièu cao của font chữ.
Thuật toán phân tích TD đƣợc thiết kế theo kiểu đệ quy, và cần tham số chièu cao của font chữ.
~k
~k
~k
~y
Thành phần độ rộng ≈k xuất hiện nhiều nhất => k là chiều cao của font chữ
Ảnh vào Lƣợc đồ chiếu đứng
Cột
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
B2.1: Tính lƣợc đồ chiếu ngang cho vùng ảnh chứa cột(i) đƣợc kết quả là mảng B gồm n phần tử
B2.2: Xác định các cột trên B
IF nếu số cột của A = 1 và số cột của B = 1 then khoanh vùng là Ảnh;
Else
For mỗi Cột(j) trên B do
TopDown(I, x(cột(i)), y(cột(j)), độ rộng(cột(i)), độ rộng(cột(j)), k);
End for End if End if End if End for End
Mã nguồn:
function ketqua=phantichtrong(start,limit,letrai,lephai,anh,nguongtach,chieu_cao_hang) y=anh;
chieucao=limit;
chieurong=lephai;
%Phan nguong va tim hinh chieu doc
% z=zeros(1,size(y,1));% z la hinh chieu doc z=zeros(1,limit-start+1);% z la hinh chieu doc for i=start:chieucao
for j=letrai:chieurong
if (y(i,j)>nguongtach) % vung nen else
z(i-start+1)=z(i-start+1)+1; % tinh cho bieu do xam end
end end
% tach khoi bang cach vao tung khoi van ban ngang tim hinhchieu ngang i=start;
start_t=i;
limit_t=i;
while (i<=chieucao)
while (i<=chieucao)&(z(i-start+1)>(2*min(z))) %di het vung van ban de tinh chieu cao i=i+1;
end
limit_t=i-1; %limit-start la chieu cao vung van ban ngang % tinh luoc do xam cho moi vung ngang
if (start_t<chieucao)&(limit_t>start_t) if limit_t>chieucao
limit_t=chieucao; % tranh vuot qua vung bien anh
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn end
y=phantich(start_t,limit_t,y,nguongtach,chieu_cao_hang,letrai,lephai);
end
while (i<=chieucao)&(z(i-start+1)<=(2*min(z))) i=i+1;
end start_t=i;
end
%%%%%%%%%%%%%%%%%%%
ketqua=y;
III.2.5. Module phân tích Fractal Signature
Giải thuật Fractal Signature
Input: Ảnh đa cấp xám I, kích thước block m x n Output: Ảnh đã phân đoạn văn bản và đồ họa Thuật toán:
B1: Chuẩn hóa kích thước ảnh được I’ (trình bày ở phần IV.2.2) B2: Lọc và làm trơn nhiễu
B3: Tách nền ra khỏi nội dung ảnh B4:
Chia ảnh I’ thành q Block có kích thước (m x n) For (mỗi Block(i) của I’) Do
B4.1: Chọn ∂ = 1
Tính giá trị lớp trên của block(i):
Tính giá trị lớp dưới của block(i)
Tính thể tích của Blanket
B4.2: Chọn ∂ = 2
Tính giá trị lớp trên của block(i):
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
56 GVHD: PGS. TS. Ngô Quốc Tạo
Tính giá trị lớp dưới của block(i)
Tính thể tích của Blanket
(với x,y thuộc Block(i)) B4.3: Tính FS(Block(i)) = End for
B5: Chọn ngƣỡng phân tách vùng nền, văn bản và đồ họa
Mã nguồn:
for i=1:round(chieucao/N) for(j=1:round(chieurong/N))
%%%%%%%%%% thao tac voi block thu K
u_layer1(:,:)=0; b_layer1(:,:)=0; u_layer2(:,:)=0; b_layer2(:,:)=0;
vol1=0; vol2=0;
block_k(2:N+1,2:N+1)=anh((i-1)*N+1:i*N,(j-1)*N+1:j*N);
% tinh gia tri cho lop tren va duoi voi delta1 cho moi vung thu k for ki=2:N+1
for kj=2:N+1 g1_u=block_k(ki,kj)+1;
g1_b=block_k(ki,kj)-1;
g2=block_k(ki,kj+1);
g3=block_k(ki,kj-1);
g4=block_k(ki+1,kj);
g5=block_k(ki-1,kj);
temp=[g1_u g2 g3 g4 g5 g1_b];
u_layer1(ki,kj)=max(temp(1:5));
b_layer1(ki,kj)=min(temp(2:6));
vol1=vol1 + (u_layer1(ki,kj)-b_layer1(ki,kj));
% tinh xong lop tren va duoi voi delta1 % tinh gia tri cho lop tren va duoi voi delta2 g1_u=u_layer1(ki,kj)+1;
g1_b=b_layer1(ki,kj)-1;
g2=u_layer1(ki,kj+1);
g3=u_layer1(ki,kj-1);
g4=u_layer1(ki+1,kj);
g5=u_layer1(ki-1,kj);
temp=[g1_u g2 g3 g4 g5 g1_b];
u_layer2(ki,kj)=max(temp(1:5));
b_layer2(ki,kj)=min(temp(2:6));
vol2=vol2+(u_layer2(ki,kj)-b_layer2(ki,kj));
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
57 GVHD: PGS. TS. Ngô Quốc Tạo
%%%%%%%%%%%%%%%% tinh xong gia tri cua lop tren duoi voi delta2 end
end % tinh FS k=k+1;
FS(k)=(vol2-vol1)/2;
end end
%%%%%%%%%%%%%%%% Tach anh va text k=0;;
anh=cat(3,anh,anh,anh);
nguong=min(FS)+50;
for i=1:round(chieucao/N) for(j=1:round(chieurong/N)) k=k+1;
if (FS(k)<nguong)|(FS(k)>4000) % text for ki=1:N
for kj=1:N
anh((i-1)*N+ki,(j-1)*N+kj,:)=255-anh((i-1)*N+ki,(j-1)*N+kj);
end end else % vung anh for ki=1:N for kj=1:N
anh((i-1)*N+ki,(j-1)*N+kj,1)=150;
anh((i-1)*N+ki,(j-1)*N+kj,3)=150;
end end end end end
III.2.6. Module lọc và làm trơn nhiễu
Có rất nhiều kỹ thuật lọc nhiễu, tuy nhiên nhƣ đã trình bày ở phần II.1.4 bản chất của FS có thể coi nhƣ đi xác định đặc trƣng độ nhám của các bề mặt thuộc vùng nền, văn bản hay đồ họa. Để nhiễu bớt ảnh hưởng đến đặc trưng này thì giải pháp làm trơn nhiễu là hiệu quả nhất nhằm làm cho các điểm ảnh gần nhau có đặc tính tương tự nhau. Điều này sẽ làm cho độ nhám mà nhiễu gây ra là không đáng kể.
Trong đề tài này sử dụng phương pháp lọc thông thấp[2] với ma trận cuộn sau:
Mã nguồn:
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
III.2.7. Module mô phỏng thuật toán FS
Module mô phỏng thuật toán FS chỉ mang tính nghiên cứu quá trình làm việc của Fractal Signature. Về mặt thuật toán giống nhƣ III.2.5 chỉ khác không cần tính thể tích của các Blanket đƣợc tạo ra mà tiến hành vẽ các blanket đó trong không gian 3D.
Giải thuật:
Input: Ảnh đa cấp xám I, kích thước block m x n Output: Demo
Thuật toán:
B1: Chuẩn hóa kích thước ảnh được I’ (trình bày ở phần IV.2.2) B2: Lọc và làm trơn nhiễu
B3: Tách nền ra khỏi nội dung ảnh B4:
Chia ảnh I’ thành q Block có kích thước (m x n) For (mỗi Block(i) của I’) Do
B4.1: Chọn ∂ = 1
Tính giá trị lớp trên của block(i):
Tính giá trị lớp dưới của block(i)
B4.2: Chọn ∂ = 2
Tính giá trị lớp trên của block(i):
Tính giá trị lớp dưới của block(i)
%%%%%%% mat na loc loc=[0 1 0;1 2 1;0 1 0];
loc=1/8*loc;
%%%%%%% dung ham loc anh=conv2(anh,loc);
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(với x,y thuộc Block(i))
B4.3: Vẽ các Blanket trong không gian 3D End for
Mã nguồn:
for i=1:round(chieucao/N) for(j=1:round(chieurong/N))
%%%%%%%%%% thao tac voi block thu K
u_layer1(:,:)=0; b_layer1(:,:)=0; u_layer2(:,:)=0; b_layer2(:,:)=0;
vol1=0; vol2=0;
block_k(2:N+1,2:N+1)=anh((i-1)*N+1:i*N,(j-1)*N+1:j*N);
% tinh gia tri cho lop tren va duoi voi delta1 cho moi vung thu k for ki=2:N+1
for kj=2:N+1 g1_u=block_k(ki,kj)+1;
g1_b=block_k(ki,kj)-1;
g2=block_k(ki,kj+1);
g3=block_k(ki,kj-1);
g4=block_k(ki+1,kj);
g5=block_k(ki-1,kj);
temp=[g1_u g2 g3 g4 g5 g1_b];
u_layer1(ki,kj)=max(temp(1:5));
b_layer1(ki,kj)=min(temp(2:6));
vol1=vol1 + (u_layer1(ki,kj)-b_layer1(ki,kj));
% tinh xong lop tren va duoi voi delta1 % tinh gia tri cho lop tren va duoi voi delta2 g1_u=u_layer1(ki,kj)+1;
g1_b=b_layer1(ki,kj)-1;
g2=u_layer1(ki,kj+1);
g3=u_layer1(ki,kj-1);
g4=u_layer1(ki+1,kj);
g5=u_layer1(ki-1,kj);
temp=[g1_u g2 g3 g4 g5 g1_b];
u_layer2(ki,kj)=max(temp(1:5));
b_layer2(ki,kj)=min(temp(2:6));
vol2=vol2+(u_layer2(ki,kj)-b_layer2(ki,kj));
%%%%%%%%%%%%%%%% tinh xong gia tri cua lop tren duoi voi delta2 end
end
% ve he truc toa do va anh 3D
trucx=[1:N+2];
trucy=[1:N+2];
meshgrid(trucx,trucy);
% axes(handles.anhgoc);
subplot(2,2,1);
anhtem=goc;
anhtem((i-1)*N+1:(i-1)*N+N,(j-1)*N+1:(j-1)*N+N)=0;
imshow(anhtem);
subplot(2,2,2);
%axes(handles.uper);
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
60 GVHD: PGS. TS. Ngô Quốc Tạo
surf(trucx,trucy,u_layer2) subplot(2,2,3);
%axes(handles.block);
imshow(255-anh((i-1)*N+1:(i-1)*N+N,(j-1)*N+1:(j-1)*N+N));
subplot(2,2,4);
%axes(handles.surf);
trucx=[1:N];
trucy=[1:N];
meshgrid(trucx,trucy);
surf(trucx,trucy,double(anh((i-1)*N+1:(i-1)*N+N,(j-1)*N+1:(j-1)*N+N)));
pause(0.3) end end
III.2.8. Các hàm chức năng chính của image processing tool trong matlab sử dụng trong chương trình
Image Processing Toolbox là một thư viện các hàm chức năng về xử lý ảnh tương thích trong môi trường MatLab. Các hàm
trong thƣ viên có thể phân loại theo chức năng nhƣ sau:
- Các phép toán hình thái
- Các phép toán trên các khối hay các vùng liên thông
- Thiết kế và lọc tuyến tính
- Chuyển đổi kiểu và không gian ảnh - Nâng cao chất lƣợng ảnh
- Các phép toán trên ảnh nhị phân - …
Một số hàm chức năng sử dụng trong chương trình[3]
a) Hàm đọc và ghi ảnh
Hàm đọc: Đọc một ảnh với đường dẫn chỉ ra, kết quả trả về là một ma trận điểm ảnh.
Cú pháp:
imread(filename,fmt);
Trong dó:
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
61 GVHD: PGS. TS. Ngô Quốc Tạo
Filename: là xâu chỉ ra đường dẫn và tên file ảnh cần đọc
Fmt: Định dạng của ảnh đƣợc đọc Các giá trị của “fmt” theo bảng sau:
Hàm ghi ảnh: Ghi ảnh ra một file Cú pháp:
imwrite(A,filename,fmt)
Ghi một ảnh trong biến mảng A với tên file là “filename” theo định dạng “fmt”
Trong đó:
- A: Vùng nhớ lưu trữ ảnh - Filename: Tên file cần ghi - Fmt: Định dạng file ảnh đầu ra
Hàm hiển thị ảnh Cú pháp:
imshow(I); %hiển thị ảnh I Trong đó:
I: Vùng nhớ chứa ảnh cần hiển thị
Hàm nhân chập: (để thực hiện lọc thông thấp làm trơn nhiễu) Cú pháp:
C = conv2(A,B)
Nhân chập mặt nạ B với ma trận A kết quả là ma trận C Trong đó:
A: Ma trận nguồn B: Mặt nạ chập C: Ma trận kết quả
Hàm chuyển ảnh từ RGB sang ảnh đa cấp xám Cú pháp:
I = rgb2gray(RGB)
Chuyển đổi ảnh “RGB” từ hệ mầu Red-Green-Blue sang ảnh đa cấp xám Trong đó:
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
- RGB: là ảnh nguồn - I: ảnh kết quả
Hàm vẽ mặt trong không gian 3D Cú pháp:
surf(X,Y,Z); %vẽ mặt một bề mặt trong không gian X,Y,Z Trong đó:
- X: mảng một chiều chƣa các điểm của trục x - Y: mảng một chiều chứa các điểm của trục y
- Z: mảng 2 chiều chƣa các giá trị của trục Z trong mặt phẳng XY.