Bảng điểm này có các đặc tính rất thuận tiện cho việc nhận diện điểm là có cột điểm được tô đen do đó khi ta nhận diện được toạ độ của điểm tô thì ta sẽ xác định được điểm và số thứ tự c
Trang 1LỜI CẢM ƠN
Em xin chân thành cám ơn Khoa Công Nghệ Thông Tin, trường Đại
Học Dân Lập Kỹ Thuật Công Nghệ, Tp HCM đã tạo điều kiện cho em thực
hiện đề tài này
Em xin chân thành cám ơn thầy Huỳnh Văn Đức đã tận tình hướng
dẫn, chỉ bảo em trong suốt thời gian thực hiện đề tài
Em cũng xin chân thành cảm ơn quý thầy cô trong Khoa đã tận tình
giảng dạy, trang bị cho chúng em những kiến thức cần thiết trong suốt quá
trình học tập tại trường, và cũng xin gởi lòng biết ơn sâu sắc đến Cha, Mẹ,
các anh chị và bạn bè đã ủng hộ, giúp đỡ, động viên em trong những lúc
khó khăn cũng như trong suốt những năm học vừa qua
Mặc dù đã cố gắng hoàn thành luận văn với tất cả những nỗ lực của
bản thân, nhưng luận văn chắc không tránh khỏi những thiếu sót nhất định,
kính mong sự cảm thông và tận tình chỉ bảo của quý Thầy Cô
Sinh viên thực hiện
Trần Viết Khôi
Trang 2LỜI TỰA
Ngày nay, với sự phát triển như vũ bão của ngành công nghệ thông tin
đã và đang đưa con người chúng ta dần tiến đến một kỷ nguyên mới kỷ
nguyên của tin học hoá trong đời sống Tin học đã len lõi vào mọi ngóc
ngách của cuộc sống đưa con người đến với một cuộc sống chất lượng hơn
Tin học còn giúp con người làm việc một cách hiệu quả hơn, năng suất cao
hơn ,… và tiết kiệm được nhiều thời gian để tập trung vào những công việc
khác hoặc các hoạt động khác (như vui chơi, giải trí)
Mục tiêu của nhà nước ta là tin học hoá các công việc văn phòng Để
làm được điều đó các nhà khoa học đã cố gắng tạo ra những chương trình để
phục vụ cho công việc trên Một trong những công việc văn phòng ở trường
học là việc nhập điểm thi của học sinh, sinh viên vào máy Do trường học
ngày càng được mở rộng, ngày càng có nhiều người tham gia học dẫn đến
công việc nhập điểm vào sổ sách ngày càng nhiều Do đó công việc nhập
điểm vào máy đòi hỏi ở người nhập phải có một sự cần mẩn và sự tập trung
cao độ trong việc nhập điểm vì nếu người nhập nhập điểm sai thì sẽ ảnh
hưởng nghiêm trọng đến kết quả học tập của người học Để cho công việc
nhập điểm trên hiệu quả hơn và ít tốn thời gian hơn thì đòi hỏi phải có một
cách nhập điểm tự động hơn
Ngày nay với sức mạnh của ngành công nghệ thông tin và dưới sự hỗ trợ
của các thiết bị phần cứng (như máy Scan, máy in …) thì sự thay thế công
việc nhập điểm bằng tay không còn khó nữa mà thay vào đó là việc nhập
điểm hoàn toàn do máy tính đảm trách muốn vậy ta phải có một chương
trình “Nhập điểm tự động”
Để tiếp cận và góp phần đẩy mạnh sự phát triển của ngành giáo dục
ở Việt Nam , chúng em xin trình bày “Hệ thống nhập điểm tự động”
Trong khuôn khổ thời gian cho phép để làm một đề tài tốt nghiệp có
thể chúng em chưa hoàn tất đầy đủ chức năng , tính linh hoạt và
phổ biến của hệ thống Sau này nếu điều kiện cho phép , đề tài này
có thể phát triển rộng hơn về quy mô hoạt động sao cho hoàn
chỉnh và phù hợp với thực tế
Chúng em luôn luôn ghi nhớ công ơn các thầy cô đã dạy dỗ để
chúng em có được như ngày hôm nay Chúng em xin chân thành
cảm ơn thầy Huỳnh Văn Đức đã tận tình giúp đỡ chúng em hoàn
thành đề tài tốt nghiệp này
Sinh viên
Trần Viết Khôi
Trang 3NHẬN XÉT CỦA GIẢNG VIÊN
Trang 4
Mục lục
Chương 1: Yêu cầu của đề tài
1 Đặt vấn đề : 8
2 Giới hạn vấn đề và phát biểu bài toán : 8
2.1 Giới hạn vấn đề : 8
2.2 Phát biểu bài toán : 8
3 Phân tích dữ liệu đầu vào và ra: 8
3.1 Mô tả bảng điểm: 9
3.1.1 Phần tựa: 9
3.1.2 Phần thân: 9
3.1.3 Phần cuối: 9
3.2 Mô tả ảnh điểm : 11
3.3 Các dữ liệu đầu ra : 12
4 Những vấn đề cần được giải quyết : 12
5 Yêu cầu của đề tài : 12
5.1 Về mặt ứng dụng 12
5.2 Về mặt kỹ thuật 12
5.3 Một số yêu cầu khác : 12
Chương 2: Phân tích vấn đề và đưa ra giải thuật 1 Các vấn đề về đọc file Bitmap : 14
1.1 Nếu ra một số định dạng ảnh khi Scan : 14
1.2 Cấu trúc của window bitmap : 15
1.2.1 Cấu trúc Header : 16
1.2.2 Cấu trúc Info Header : 16
1.2.3 Cấu trúc bảng màu : 17
1.3 Phân tích một số khó khăn khi đọc ảnh bitmap : 17
1.4 Đưa ra cách đọc ảnh khả thi : 18
1.5 Xây dựng giải thuật : 18
1.5.1 Mô tả giải thuật : 18
1.5.2 Lưu đồ giải thuật : 20
1.6 Đoạn chương trình minh hoạ : 21
2 Xử lý màu trong bảng điểm : 23
2.1 Chế độ màu khi Scan : 23
2.2 Lý do phải lọc màu trong bảng điểm : 24
2.3 Đưa ra những khoảng màu được sử dụng để lấy điểm đen : 24
2.4 Xây dựng giải thuật : 24
2.4.1 Mô tả giải thuật : 24
2.4.2 Lưu đồ giải thuật : 25
Trang 52.5 Đoạn chương trình minh hoạ : 25
3 Quá trình xử lý ảnh bị biến đổi : 25
3.1 Tại sao phải xử lý ảnh bị biến đổi : 26
3.2 Các loại biến đổi thường gặp trong file điểm : 26
3.2.1 Phép tịnh tiến : 26
3.2.2 Phép quay : 26
3.2.3 Phép biến dạng : 27
3.3 Tại sao chỉ xử lý biến đổi quay : 28
3.4 Các giải pháp để xử lý một ảnh quay : 28
3.5 Xây dựng giải thuật : 29
3.5.1 Tính góc quay : 29
3.5.1.1 Giải thuật tính góc quay : 29
3.5.1.2 Lưu đồ giải thuật : 29
3.5.2 Tính ma trận quay : 30
3.5.2.1 Giải thuật tính ma trận quay : 30
3.5.2.2 Lưu đồ giải thuật : 30
3.5.3 Chuyển đổi toạ độ của một điểm theo ma trân quay : 31
3.5.3.1 Giải thuật chuyển toạ độ : 31
3.6 Đoạn chương trình minh hoạ : 31
3.6.1 Tính góc quay : 31
3.6.2 Tính ma trận quay : 31
3.6.3 Chuyển toạ độ theo ma trận quay : 32
4 Xác định mốc : 32
4.1 Tại sao phải sử dụng mốc : 33
4.2 Xác định các khoảng ảnh có thể xác định được mốc : 33
4.3 Giải pháp để xác định tâm của một mốc : 34
4.4 Xây dựng giải thuật : 35
4.4.1 Xác định mốc có trong một khoảng điểm : 35
4.4.1.1 Giải thuật : 35
4.4.1.2 Lưu đồ : 36
4.4.2 Xác định một pixel đen có thuộc một mốc : 37
4.4.2.1 Giải thuật : 37
4.5 Đoạn chương trình minh hoạ: 39
4.5.1 Chương trình xác định mốc trong một khoảng điểm : 39
4.5.2 Chương trình xác định một pixel có thuộc một mốc : 39
5 Xác định điểm tô đen : 40
5.1 Tại sao phải xác định điểm tô đen : 40
5.2 Xác định các khoảng ảnh có thể tìm được điểm tô : 41
5.3 Giải pháp để xác định tâm của điểm tô : 42
5.4 Xây dựng giải thuật : 43
Trang 65.4.1 Xác định điểm tô trong một khoảng điểm : 43
5.4.1.1 Giải thuật : 43
5.4.1.2 Lưu đồ : 44
5.4.2 Xác định một pixel đen có thuộc điểm tô : 46
5.4.2.1 Giải thuật : 46
5.5 Đoạn chương trình minh hoạ : 49
5.5.1 Chương trình xác định điểm tô trong một khoảng điểm: 49
5.5.2 Chương trình xác định một pixel đen có thuộc điểm tô : 49
6 Xác định điểm : 52
6.1 Tầm quan trọng của việc xác định điểm : 52
6.2 Xác định các toạ độ có điểm : 52
6.3 Giải pháp để tính điểm : 53
6.4 Xây dựng giải thuật : 54
6.4.1 Giải thuật tính điểm : 54
6.4.2 Lưu đồ tính điểm và vị trí : 56
6.5 Đoạn chương trình minh hoạ cách tính điểm và vị trí : 57
7 Các file mà chương trình xuất ra : 58
7.1 Tầm quan trọng của file này : 58
7.2 Cấu tạo của file điểm : 58
7.3 Cấu tạo của file lỗi : 58
7.3.1 Cấu tạo : 58
7.3.2 Danh sách các lỗi có thể xảy ra : 59
Chương 3: Thiết kế chương trình 1 Quá trình nhập điểm tự động : 60
2 Danh sách các sự kiện của quá trình xử lý điểm : 60
3 Sơ đồ dòng dữ liệu (DFD) về quá trình xử lý nhập điểm tự động: 60
Chương 4: Đánh giá sai số 1 Lý thuyết xác suất thống kê bài toán ước lượng tỷ lệ: 66
2 Aùp dụng để tính toán cho bài toán : 67
Chương 5: Kết luận
Trang 7CHƯƠNG 1:
YÊU CẦU CỦA ĐỀ TÀI
1 Đặt vấn đề :
Từ trước đến nay trên thực tế ở Việt Nam chưa có một chương trình nào
phục vụ cho việc nhập điểm tự động Đề tài này em rất thích vì nó gắn liền
thực tế và nó là một nhu cầu cần thiết của ngành giáo dục Nếu chương trình
Trang 8hoạt động tốt nó sẽ giúp ích rất nhiều trong việc nhập điểm, và thông kê
điểm một cách nhanh chóng trong các cuộc thi có số lượng thí sinh tham gia
đông như các cuộc thi đại học …
2 Giới hạn vấn đề và phát biểu bài toán :
2.1 Giới hạn vấn đề :
Vấn đề nhập điểm tự động là một vấn đề rất khó đòi hỏi ta phải có một
khoảng thời gian tương đối dài để giải quyết vấn đề như nhận ra các chữ
viết tay của các thầy (các điểm số), mã số của các thí sinh, các môn học, kì
thi … vấn đề trên đối với chúng em thì rất khó có thể giải quyết được trong
khoảng thời gian là 15 tuần Do đó chúng em đưa ra một cách giải quyết
khác là thay vì nhận dạng chữ viết tay để tìm điểm thì chúng em sẽ nhận
dạng những điểm tô đen trên bảng điểm theo mẫu của trường ĐHDL Kỹ
thuật công nghệ Bảng điểm này có các đặc tính rất thuận tiện cho việc
nhận diện điểm là có cột điểm được tô đen do đó khi ta nhận diện được toạ
độ của điểm tô thì ta sẽ xác định được điểm và số thứ tự của điểm đó trong
bảng điểm
Như vậy vấn đề nhập điểm hoàn toàn tự động đã được chuyển về hướng
là khi nhập điểm thì người sử dụng phải gõ vào số phách, môn, lớp và có
thể là số lần thi Do đó vấn đề ở đây là làm sao nhận dạng được tâm của
các điểm tô và cho ra điểm đưa vào CSDL
2.2 Phát biểu bài toán :
Giáo viên khi chấm điểm xong sẽ đưa bảng điểm lên phòng đào tạo
Người nhập điểm sẽ lấy bảng điểm đưa vào máy Scan, máy Scan cho ra một
file ảnh Bitmap, file ảnh này sẽ được đưa vào “Hệ thống nhập điểm tự
động” cùng với số tờ, môn học, khoá học Chương trình sẽ xử lý chỉnh sữa
sao đó cho ra một file văn bản, file này sẽ được một chương trình cấp giao
diện đọc và xử lý để lấy được điểm và mã số sinh viên tương ứng với bảng
điểm thật và sau đó lưu vào CSDL
“Hệ thống nhập điểm tự động” là hệ thống cho phép người nhập điểm
có thể nhập một bảng điểm tự động vào hệ thống quản lý điểm
3 Phân tích dữ liệu đầu vào và ra:
Dữ liệu đầu vào của chương trình là một bảng điểm theo một mẫu quy
định khi cho vào máy Scan sẽ cho ra một file ảnh, file ảnh này được chương
trình đọc và xử lý sau đó chương trình cho ra hai file một file chứa điểm và
vị trí đã xử lý và một file chứa các lỗi nếu có xảy ra Sau đó một chương
trình xử lý về CSDL sẽ đọc hai file text đó vào xử lý và cho ra điểm, mã số
của sinh viên và mã môn cho vào CSDL Dưới đây là sự mô tả các dữ liệu
trên
3.1 Mô tả bảng điểm:
Trang 9Phiếu điểm màu chủ đạo là màu đỏ, các thông tin quan trọng có màu
đen hoặc xanh dương, gồm có 3 phần chính : phần tựa, phần thân, phần
cuối
3.1.1 Phần tựa:
Có phần thông tin cho biết bảng điểm này thuộc về trường nào, lớp nào,
khoa nào, thi môn gì, phòng nào, lúc mấy giờ…Ở phần này có một điểm
quan trọng để phục vụ cho công việc vào điểm tự động là nó có một mốc
Mốc là một chấm tròn đen lớn bên góc trái gọi là mốc 1, đường kính đo
được là 4cm nằm cách mép giấy bên trái là 5cm Kế bên là dòng chữ nói về
trường, khoa và lớp… Góc bên phải là khung nhỏ chỉ dẫn cách chấm điểm
đối với bảng điểm này
Từ tâm của chấm tròn đen đến phần thân là 32cm
3.1.2 Phần thân:
Là một bảng gồm có 8 dòng và 32 cột Dòng đầu tiên là dòng tiêu đề và
30 dòng còn lại là thông tin về học sinh hoặc sinh viên và phần điểm thi
Cột đầu tiên là cột thông tin về số thứ tự, cột thứ hai là cột thông tin về mã
số của học sinh hoặc sinh viên, cột thứ ba là phần thông tin về họ và tên của
học sinh hoăc sinh viên, cột thứ tư là thông tin về ngày tháng năm sinh của
học sinh hoặc sinh viên, cột thứ năm là phần thông tin điểm ghi bằng số, cột
thứ sáu là thông tin về điểm tô, trong đó có 10 ô tròn để giáo viên tô đen
tương ứng với điểm trong ô tròn có ghi các số từ 0 đến 10 là phần điểm
tương ứng với phần ô được tô đen Cột thứ bảy là phần ký tên của thí sinh và
cột thứ tám là phần ghi chú của giám thị Mỗi dòng trên phần này tương ứng
với một thí sinh được lưu trong CSDL của trường
Điểm ghi và điểm tô được giáo viên chấm với màu bút có màu đen hoặc
màu xanh da trời và bắt buộc phải như vậy
Vị trí từ tâm của mốc 1 đến cột của điểm tô cách nhau một khoảng chiều
rộng là 107 cm Khoảng cách của mỗi dòng là 6cm, khoảng cách của các ô
tròn trong phần điểm tô tính từ biên của cột điểm của phần điểm tô là 4,5
cm Đường kính của các ô tròn điểm là 3 cm Chiều rộng của cột điểm tô là
46cm
Phần này có chiều rộng là 188cm, chiều cao là 188cm
3.1.3 Phần cuối:
Có các thông tin sau: số sinh viên có trong bảng điểm, số sinh viên dự
thi, số sinh viên đạt sau khi chấm xong, số sinh viên không đạt, chữ ký của
các cán bộ coi thi, chữ ký của các giáo viên chấm thi, chữ ký của thầy
trưởng khoa, ngoài ra nó còn có một thông tin nữa mà không liên quan gì
đến việc thi cử nhưng nó rất quan trọng cho việc nhập điểm tự động là mốc
thứ hai của bảng điểm
Trang 10Điểm đen này nằm ở góc phải của bảng điểm, có đường kính là 4cm Khoảng
cách từ tâm mốc 1 đến tâm mốc 2 : chiều rộng là 183 cm , chiều cao là 223 cm
Dưới đây là bảng điểm đã được mô tả ở trên
3.2 Mô tả ảnh điểm
Trang 11Một bảng điểm khi qua máy Scan sẽ cho ra một file ảnh điểm File ảnh
điểm mà chương trình sử dụng phải là ảnh window bitmap có độ phân giải
là 8 bit màu, chế độ màu là màu xám (nghĩa là 225 màu tương ứng với ảnh
chỉ có các pixel sắc độ xám), ảnh không sử dụng các chuẩn nén nào, theo
chuẩn TWAIN, ảnh Scan phải có độ phóng đại 100% Aûnh phải có những
đặc điểm trên thì chương trình mới xử lí được
Aûnh điểm là một sản phẩm của máy Scan mà máy Scan là một thiết bị
vật lí do đó đối với những máy Scan khác nhau đều cho ra những ảnh Scan
khác nhau về màu sắc, kích thước, độ nét của bức ảnh … những khác biệt đó
do rất nhiều nguyên nhân như máy Scan cũ, mới, khác hiệu… Bản thân máy
Scan khi ta Scan cùng một bức ảnh tại nhiều thời điểm khác nhau thì những
ảnh Scan đó cũng không hoàn toàn giống nhau Một bảng điểm khi Scan
cho ra một ảnh Scan đôi khi lại không hoàn toàn giống như ảnh ban đầu ví
dụ : những điểm mốc đôi khi lại không tròn như thực tế … Ngoài ra còn có
những sai lạc do con người gây ra như đặt ảnh vào máy Scan không thẳng,
ảnh bị dơ, ảnh bị dịch chuyển, quay và đôi khi còn bị biến dạng do giấy bị
cong…những biến dạng và sai lệch trên chúng ta không thể nào loại bỏ được
Ơû trong bài này, chúng ta không giải quyết vấn đề ảnh bị biến dạng mà chỉ
giải quyết vấn đề ảnh bị xê dịch, quay và bức ảnh phải rõ nghĩa là các điểm
và mốc phải có màu khác biệt so với màu viền
Các thông số cần quan tâm của một ảnh Scan chuẩn :
Màu của các mốc và điểm tô phải có giá trị màu trong khoảng 0
-> 85 Nghĩa là ảnh Scan phải có màu tương đối nhìn thấy rõ
Mốc phải có mật độ các pixel đen từ 100 -> 196 pixel Nghĩa là
mật độ điểm đen của mốc phải có độ lớn tương đối so với các
điểm khác để dễ phân biệt
Điểm tô đen phải có mật độ các pixel đen từ 30 -> 144 pixel
Điểm tô phải được tô hơn phân nửa của ô cho tô điểm
Khoảng cách tính được từ tâm mốc 1(ở góc trái trên) đến tâm mốc
2 (ở góc phải dưới) có chiều rộng = 730 pixel, chiều cao= 874
pixel
Khoảng cách tính được từ tâm điểm mốc một đến vị trí đầu của ô
điểm tô có chiều rộng= 426 pixel và chiều cao= 144 pixel
Chiều rộng của một ô để tô điểm tính được là 16 pixels 11 ô
điểm là 176 pixel
Chiều cao của một hàng tính được là 24 pixel 30 hàng là 720
pixel
Aûnh điểm sử dụng để tính điểm phải có đầy đủ hai mốc và độ quay của
ảnh không vượt qua 10 độ được tính từ mốc một
Trang 123.3 Các dữ liệu đầu ra :
Đầu ra của chương trình gồm có hai file text có cấu trúc như sau:
Đối với file chứa điểm và vị trí gồm có 2 cột : cột thứ nhất chứa số thứ tự
của thí sinh trong bảng điểm, cột 2 chứa điểm tương ứng với số thứ tự của thí
sinh trong bảng điểm
Đối với file chứa lỗi sẽ chứa lỗi của chương trình nếu nó xảy ra trong
quá trình xử lý tìm điểm và vị trí
4 Những vấn đề cần được giải quyết :
Từ yêu cầu của bài toán đã phát sinh ra một số vấn đề mà ta cần phải
giải quyết để xử lý cho bài toán nhập điểm tự động:
Làm sao đọc được một ảnh bitmap
Vấn đề xử lý màu trong bảng điểm
Vấn đề xử lý ảnh bị biến đổi
Vấn đề nhận dạng mốc
Nhận dạng điểm tô đen
Tính điểm và vị trí
Xuất dữ liệu
Những vấn đề được nêu ở đây sẽ được giải quyết trong các chương
sau của đề án này
5 Yêu cầu của đề tài :
5.1 Về mặt ứng dụng
Xây dựng một hệ thống nhập điểm tự động, trong đó hệ thống cho phép
người nhập điểm có được các điểm được nhập nhanh và chính xác điểm của
các thí sinh có trong bảng điểm vào trong máy tính (CSDL)
5.2 Về mặt kỹ thuật
Bài toán yêu cầu hệ thống có được những khả năng về mặt kỹ thuật sau:
Có một máy Scan
Hệ điều hành Window 9x, 2000
5.3 Một số yêu cầu khác
Ngoài các yêu cầu trên, ứng dụng có thể:
Dễ dàng cài đặt
Dễ dàng sử dụng
Dễ dàng cập nhật và nâng cấp
Trang 13CHƯƠNG 2:
PHÂN TÍCH VẤN ĐỀ VÀ ĐƯA RA GIẢI THUẬT
1 Các vấn đề về đọc file Bitmap :
1.1 Nếu ra một số định dạng ảnh khi Scan :
Trang 14SVTH: Trần Viết Khôi Trang 14
Một bức ảnh khi Scan sẽ cho ra một file ảnh ánh xạ lại tất cả những gì
mà bức ảnh có được Do cơ cấu làm việc của máy Scan là nhận dạng ánh
sáng phản chiếu từ bức ảnh thật để cho ra những điểm sáng tương ứng với
những điểm trên bức ảnh, do đó ảnh của máy Scan trả ra là một dạng ảnh
điểm khi qua một trình xử lý đồ hoạ của máy Scan ta sẽ lưu ảnh đó lại với
những định dạng nào ta thích Đối với các loại ảnh dạng vector thì kích
thước của file ảnh rất nhỏ và ảnh hiển thị trên màn hình sẽ không phụ thuộc
vào độ phân giải của màn hình nhưng cơ cấu lưu ảnh của chúng rất phức tạp
do đó để đọc và xử lý ảnh dạng vector là điều rất khó, trong khi đó một ảnh
lưu dưới dạng pixel khi hiển thị trên màn hình sẽ phụ thuộc vào độ phân giải
của màn hình và kích thước file rất lớn đối với những ảnh có độ phân giải
cao nhưng bù lại chúng rất dễ đọc và dễ xử lý
Có rất nhiều định dạng ảnh mà lưu ảnh được với dạng pixel, trong số đó
có Window bitmap là được sử dụng rất nhiều trong các hệ điều hành
Windows và được sử dụng rất nhiều trong các phần mền khác Vì những lý
do trên nên ta sẽ sử dụng file ảnh bitmap dùng cho vấn đề nhận dạng của
bài toán này
1.2 Cấu trúc của window bitmap :
Windows bitmaps thì có ở khắp nơi trên máy tính Dưới các hệ điều hành
của Microsoft chúng ta có thể sử dụng bitmap như icons, cursors, wallpaper,
và các thành phần khác Tuy nhiên, Windows bitmaps thì không được dùng
phổ biến trên mạng Bởi vì hầu hết các file bitmap đều không được nén,
chúng có kích thước rất lớn so với các file được định dạng theo kiểu GIF
hoặc JPEG
Một file Windows bitmap chứa bốn phần: the bitmap file header, the
bitmap info header, the color table, và dữ liệu của ảnh
Lưu ý: Tất cả các con số được lưu trong file bitmap đều dưới dạng Intel
byte được hiểu như là little-endian Điều này có nghĩa là byte đầu tiên trong
file thể hiện một số little-end Ví dụ nếu bạn có một số hex 0x1234 được
định dạng trong little-endian, bạn sẽ viết như sau 0x34 theo sau là 0x12
Đây là kiểu định dạng của Microsoft Nếu bạn dùng Java thì bạn phải đưa
về kiểu định dạng big-endian nghĩa là đưa về dạng số hex ban đầu 0x1234
Bitmap file Header Bitmap Info Header The color table
Trang 151.2.1 Cấu trúc Header :
2 Character Loại file (file type) bắt đầu bằng ‘B’ và ‘M’
4 32-bit Int Tổng kích thước của file tính bằng byte
2 16-bit Int Dự trữ
2 16-bit Int Dự trữ
4 32-bit Int Byte-offset của file ở đó bitmap bit thực sự bắt đầu
File type trong bitmap file header cho phép chương trình biết chắc chắn
đây là một file bitmap trước khi xử lý Nếu nó không bắt đầu với “BM” thì
không phải là file bitmap Byte offset for the bitmap thì rất là quan trong,
bởi vì có một vài vùng đệm giữa những bit header và những bit thực sự
Chúng ta cần phải biết có bao nhiêu vùng đệm để bỏ qua
Lưu ý: Kỹ thuật đặt một giá trị đặt biệt tại vị trí bắt đầu của một file ( như
“BM”) thì rất phổ biến Giá trị này thường ám chỉ như một số định dạng Unix
thường sử dụng kỹ thuật này để định nghĩa các loại file
1.2.2 Cấu trúc Info Header :
4 32-bit Int Kích thước của info header (tính bằng byte)
4 32-bit Int Chiều rộng (tính pixels)
4 32-bit Int Chiều cao (tính pixels)
2 16-bit Int Số bitplanes (nên là 1)
2 16-bit Int Số bit trên pixel
4 32-bit Int Loại nén được sử dụng
4 32-bit Int Số byte thực sự trên bitmap (chỉ cần thiết nếu nén được sử dụng)
4 32-bit Int Số pixel nằm ngang trên dụng cụ đo (chỉ dùng cho scaling)
4 32-bit Int Số pixel nằm đứng trên dụng cụ đo (chỉ dùng cho scaling)
4 32-bit Int Số màu thực sự được sử dụng
4 32-bit Int Số màu mà thực sự quan trọng (giúp ta làm giảm số màu sử
dụng)
Trang 16Nếu loại nén trong bitmap info header là 0 nghĩa là không sử dụng nén
Nếu loại nén là 1, bitmap sử dụng loại nén RLE8 loại nén là 2 chỉ rằng
bitmap sử dụng loại nén RLE4
Nén RLE8 và RLE4 cả hai đều mã hoá theo lược đồ run-length đơn giản
Chỉ khác là RLE4 thì được sử dụng khi bạn có 4-bit pixels, và RLE8 thì được
sử dụng khi bạn có 8-bit pixels Một mã 2-byte có thể chứa số lần lập lại và
giá trị một pixel Số lần lập lại chỉ ra có bao nhiêu lần giá trị pixel trong một
dòng được lập lại Nếu byte đầu tiên của đoạn mã là 0, thì byte thứ hai có
thể chỉ ra bất cứ số nào Điều đó có nghĩa rằng bạn có thể nhảy tới dòng
tiếp theo, hoặc bạn có thể có một số byte không mã hoá theo mã 2-byte
này Bạn có thể hoàn toàn lờ đi mã hoá run-length và hầu như được hỗ trợ
của Windows bitmaps Một vài ảnh thực sự sử dụng mã hoá run-length
1.2.3 Cấu trúc bảng màu :
Sau bitmap info header là bảng màu Màu thì được lưu dưới định dạng
được gọi là RGBQUAD chứa 4 byte Một giá trị RGBQUAD chứa một giá
trị 8-bit cường độ blue, 8-bit cường độ green, 8-bit cượng độ red, và 8-bit 0
Bởi vì tất cả các màu đều được pha trộn từ ba màu red-green-blue, nhưng
nhớ rằng đây thực sự được là một số 32-bit little-endian Nếu bạn đọc một
RGBQUAD và thực hiện sửa lại cho đúng, bạn nên thiết lập chuẩn màu
RGB Số màu trong bảng màu thì được cho trong bitmap info header như là
số màu thực sự được sử dụng
Lưu ý: Nếu bitmap chứa những pixel sử dụng 24-bit màu, thì nó không
có bảng màu bởi vì giá trị màu thì được lưu trữ trong pixel bits
Cấu tạo bảng màu:
1.2.4 Cấu trúc của dữ liệu :
Mọi thứ khác thường nhất thuộc về Windows bitmaps là sự lưu trữ
upside-down Dòng cuối cùng trong bitmap thì được lưu trữ ở dòng đầu và
những dòng đầu thì được lưu trữ ở cuối
Số bit để lưu dữ liệu của ảnh thì được lưu trong phần bitmap info header
và tuỳ vào các loại nén được sử dụng trong file
Điều này sẽ gây phức tạp cho ta khi đọc một ảnh Windows bitmaps Ta
phải đọc dòng đầu của file ảnh bitmap và sau đó lưu vào vị trí dòng cuối
cùng của mảng hiển thị Đối với bitmap lớn hơn 64 Kb thì điều này sẽ rất
khó khăn
Cách đọc dữ liệu ảnh sẽ được mô tả trong chương sau
8-bit Blue 8-bit Green 8-bit Red 8-bit 0
Trang 171.3 Phân tích một số khó khăn khi đọc ảnh bitmap :
Aûnh bitmap là một ảnh dạng pixel do đó nó có kích thước rất lớn Một
bảng điểm khi Scan ra file ảnh bitmap (100%) thường có chiều rộng khoảng
783 pixel và chiều cao khoảng 1108 pixel như vậy một ảnh điểm sẽ có tổng
cộng khoảng 867564 pixel tương đương khoảng 804 Kb Để đọc được toàn
ảnh bitmap vào bộ nhớ đòi hỏi máy tính của ta phải có một bộ nhớ lớn và
tốc độ máy phải cao Với nền kinh tế nước ta ngày nay thì rất khó có thể
đáp ứng được Do đó, ta phải có một cách khác để tiến hành việc đọc file
điểm trên, mà nếu ta có được những điều kiện trên thì với một bộ nhớ máy
tính được cấp phát hạng hẹp như của chương trình C++ (64Kb) thì việc đọc
toàn bộ bức ảnh vào bộ nhớ là một chuyện không tưởng; do đó ta chỉ có thể
tìm ra một cách xử lý nào đó để đọc ảnh
Để đọc được một ảnh bitmap thì ta gặp một khó khăn rất lớn là không
đủ bộ nhớ để đọc toàn bộ ảnh bitmap
1.4 Đưa ra cách đọc ảnh khả thi :
Từ những khó khăn đã được nói ở trên dẫn đến việc ta phải tìm cách nào
để đọc được từng phần của bức ảnh ánh xạ nó vào bộ nhớ và tiến hành xử
lý bức ảnh theo kiểu xử lý từng phần
Khi đọc từng phần của bức ảnh ta có được những cái lợi như là không sợ
không đủ bộ nhớ, vì chương trình không đọc hết toàn bộ bức ảnh mà chỉ đọc
những phần quan trọng cần giải quyết, điều này làm cho chương trình chạy
nhanh hơn Ngoài ra, ta còn có những điểm khó khăn như khi đọc từng phần
ta sẽ đọc những nơi nào và có chắc rằng những nơi đó là luôn luôn chính
xác hay không? Do rất nhiều nguyên nhân ảnh hưởng đến bức ảnh Scan do
đó vấn đề nêu trên sẽ không khắc phục được hoàn toàn mà chỉ giải quyết
một phần nào đó thường xảy ra mà thôi
Vấn đề ở đây là ta phải đọc được từng phần của bức ảnh, muốn đọc được
từng phần của bức ảnh phải có được tối thiểu các thông tin sau : khoảng
ảnh muốn đọc, chiều rộng và chiều cao thật sự của bức ảnh
Với giải pháp đã đưa ra ta thấy việc đọc từng phần của bức ảnh là một
giải pháp rất khả thi vì nó không tốn kém nhiều về bộ nhớ và chương trình
ta chạy nhanh
1.5 Xây dựng giải thuật :
1.5.1 Mô tả giải thuật :
Aûnh Scan chưa phải qua xử lý bởi một trình xử lý đồ họa nào Để đọc
được ảnh này đòi hỏi chương trình phải lường trước mọi khả năng có thể xảy
ra ví dụ như đó không phải là ảnh điểm, ảnh quá mờ, ảnh bị biến dạng, ảnh
không nằm đúng vị trí cần thiết,
Trang 18Như ta đã phân tích ở trên thì một ảnh bitmap có kích thước rất lớn dó đó
ta phải có cách giải quyết là đọc ảnh bitmap theo từng phần Muốn đọc
được từng phần của bức ảnh ta phải có được các thông tin tọa độ góc trên và
tọa độ góc dưới, chiều rộng và chiều cao của ảnh
Giải thuật để đọc ảnh bitmap từng phần:
Đổi tọa độ của các điểm để phù hợp với toạ độ của file ảnh, cụ
thể là tọa độ y của hai góc Bởi vì file bitmap là một file mà nội
dung của ảnh được lưu ngược nên khi ta đưa tọa độ vào là tọa độ
hiển thị của bức ảnh nếu ta không đổi tọa độ thì ta sẽ nhận được
ảnh không đúng như ý định của ta Tọa độ được tính như sau:
y1=height-y1 y2=height-y2 Khi tiến hành đổi tọa độ xong ta mới tiến hành đọc phần ảnh đó
Mỗi bức ảnh lớn đều có những phần dư ra ở cuối mỗi dòng Do đó
trước khi tiến hành đọc ảnh ta phải tính được phần dư đó để có
những bước nhảy đúng Mỗi bức ảnh đều có những phần dư khác
nhau do cơ chế lưu ảnh của Microsoft Bitmap (gọi là hiệu ứng lề
của ảnh bitmap) Để đọc ảnh chính xác ta phải khử hiệu ứng lề
của ảnh, công thức để tính hiệu ứng lề dư ra như sau:
du=fileSize-(bitmapOffset+width*height) du=du/height
Ta tiến hành nhảy đến vị trí của (x1,y1) đọc từng pixel cho đến
x2 Sau đó nhảy đến vị trí của của y1-1 và tiến hành đọc như trên
cứ thế cho đến khi đến vị trí của (x2, y2) thì dừng lại Quá trình
đọc là quá trình đọc ngược từ dưới lên trên nhưng lưu vào mảng là
từ trên xuống dưới
Công thức tính bước nhảy đến toạ độ (x1, y1) có khử hiệu ứng lề:
offset=bitmapOffset+((width+du)*y1)+x1
Trong quá trình đọc ta tiến hành cùng lúc với việc lọc màu các
điểm khi ấy mảng đọc được trong phần ảnh trên là một mảng toàn
0 và 1 với giá trị 0 là những màu không quan tâm và 1 là những
màu đen Việc lọc màu làm cho quá trình xử lý của ta được đơn
giản vì ta không cần quan tâm là màu này là màu đen … Quá trình
lọc màu và lọc ảnh được tiến hành như sau:
Những điểm nào có màu từ 0 -> 83 thì ta giữ lại và xem nó là điểm đen và lưu nó là 1, còn các điểm khác thì cho là 0
du = fileSize - ( bitmapOffset + width * height)
du = du / height
y = y1 - y2
x = x2 - x1
Trang 19h= 1
while (h <= y)
Begin
pos = (h - 1) * x offset=bitmapOffset + ((width + du) * (y1 - h)) + x1 // nhảy đến vị trí offset
fseek(in,offset,0) w=0
while ( w < x) Begin
// đọc dữ liệu ảnh fread(&currByte,1,1,in) // lọc màu và gán cho mảng dữ liệu pixels[pos++] = filter(currByte) End
End
Trang 201.5.2 Lưu đồ giải thuật :
Begin
End
x1, y1 x2, y2 width,height
w < x
Đúng w++
h <=y
Sai Đúng h++
Sai
Khối lọc màu
Trang 211.6 Đoạn chương trình minh hoạ :
Chương trình hiện thực việc xử lí của lưu đồ trên để đọc một khối
các pixel trong file ảnh ra một mảng các pixel:
Hàm mô tả việc đọc một đoạn pixel ra mảng: hàm này có bốn
tham số đưa vào x1,y1,x2,y2 bốn tham số này có kiểu là số nguyên
có ý nghĩa là toạ độ của điểm trái trên và điểm trái dưới của phần
ảnh cần đọc, toạ độ này là toạ độ thật khi ta xem một bức ảnh Hàm
trả về một mảng pixel đã được đọc từ file ảnh
unsigned char* BMPReader::getPixels(int x1,int y1,int x2,int y2) {
// chuyển đổi toạ độ sang toạ độ thật của ảnh
y1=height-y1;
y2=height-y2;
// cấp phát bộ nhớ cho mảng chứa thông tin ảnh (pixel)
if(!(pixels= new unsigned char[long(y1-y2)*(x2-x1)]))
{ printf("khong du bo nho");
Hàm mô tả cách đọc ảnh : hàm bên dưới hiện thực cách đọc ảnh
kiểu RGB không nén ảnh có độ phân giải là 8 bit, nghĩa là trong một
byte được lưu trữ trong file chỉ chứa nội dung của một pixel mà thôi
Hàm này có bốn tham số đưa vào: toạ độ của góc trái trên và góc
phải dưới của phần ảnh trên file bitmap, toạ độ này là toạ độ thực
trên file ảnh Hàm này ngoài chức năng đọc nó còn có chức năng khử
hiệu ứng lề và làm chức năng của bộ lọc màu của ảnh Nguyên tắc
khử hiệu ứng lề khi ảnh đọc đến biên nó phải bỏ qua một số byte do
hiệu ứng lề gây ra, các byte hiệu ứng lề đã được mô tả như ở trên
Hàm này thuộc lớp BMPReader lớp này có chức năng để đọc các file
ảnh bitmap
Trang 22Hàm có 4 tham số đưa vào là toạ độ hai góc trên và dưới của đoạn
ảnh cần đọc, 4 tham số này có kiểu là số nguyên Hàm này thuộc lớp
BMPReader
void BMPReader::readRGB(int x1,int y1,int x2,int y2) {
//khai báo các biến dùng cho việc di chuyển của con trỏ file
//chứa byte hiện hành
unsigned char currByte;
//chứa chiều rộng và chiều cao của phần pixel cần đọc
//đọc từ trên xuống của bức ảnh
for (int h=1; h <=y; h++) {
//vị trí của phần tử trong mảng pixel long pos = long(h-1)* x;
//vị trí cần đọc giá trị pixel offset=bitmapOffset+((width+du)*long(y1-h))+x1;
//nhảy đến vị trí cần đọc fseek(in,offset,0);
//đọc theo chiều ngang của bức ảnh for (int w=0; w < x; w++) { //đọc giá trị tại vị trí hiện hành fread(&currByte,1,1,in);
//lọc chỉ lấy những điểm màu có giá trị từ 0 đến 83 biến thành giá trị là 1
pixels[pos] = filter(currByte);
pos++;
} } }
Trang 232 Xử lý màu trong bảng điểm :
2.1 Chế độ màu khi Scan :
Trong bảng điểm có từ 2 đến 3 màu cơ bản là màu đỏ, xanh dương và
đen Khi Scan ra file ảnh sẽ cho ra rất nhiều cường độ màu khác nhau, bảng
thân trong một điểm đen đã có rất nhiều sắc độ màu hình thành nên điểm
đen Khi scan trên nhiều máy Scan sẽ cho ra nhiều bức ảnh có sắc độ màu
khác nhau, độ sáng tối của ảnh cũng khác nhau
Vấn đề trên là một vấn đề liên quan đến cơ cấu vật lý của máy in và
máy Scan, ta không thể nào khắc phục được Đối với những chế độ màu
khác nhau như chế độ màu 24 bit nghĩa là có 224 màu nếu ta chọn Scan với
chế độ này thì ta sẽ rất khó khăn trong vấn đề lọc màu vì nó sinh ra một
khoảng màu rất lớn, dẫn đến file ảnh của ta cũng rất lớn khó trong việc xử
ly.ù Thay vào đó nếu ta chọn chế độ màu là 8 bit nghĩa là có 256 sắc độ màu
mô tả cho bức ảnh và khó khăn trên được giảm bớt
Do đó việc chọn chế độ màu 8 bit sẽ làm cho công việc xử lý của ta ít
vất vả hơn và chương trình sẽ chạy được nhanh hơn
2.2 Lý do phải lọc màu trong bảng điểm :
Một file ảnh của bảng điểm scan với chế độ màu 8 bit khi nhìn ta thấy
chỉ có những chấm đen và các điểm còn lại có màu nhạt hơn nhưng thật sự
trong những chấm đen và những màu nhạt đó là vô số sắc độ màu khác
nhau Nếu ta xử lý điểm mà không lọc màu thì ta rất dễ lầm lẫn giữa những
màu sắc của chấm đen và những màu chữ và màu viền Do đó làm cho vấn
đề xử lý ảnh của ta trở nên phức tạp để nhận diện các điểm đen trong vô số
các điểm khác của bức ảnh
Khi ta lọc màu chỉ để lại những điểm màu nào cần quan tâm thì việc
nhận diện các màu trở nên đơn giản hơn và làm cho quá trình nhận dạng trở
nên nhẹ nhàng hơn
2.3 Đưa ra những khoảng màu được sử dụng để lấy điểm đen :
Khi khảo sát trên một vài bức ảnh điểm ta nhận thấy những điểm mốc và
những điểm tô đen có sắc màu trong khoảng từ 0 đến 83 những sắc màu lớn
hơn là màu của những màu nhạt Tuy nhiên khoảng màu trên chỉ là tương
đối đúng với một số bức ảnh, với những bảng điểm có sắc độ đậm thì
khoảng màu trên không hoàn toàn loại bỏ được tất cả các điểm màu của
đường viền
Tuy nhiên với khoảng màu từ 0 đến 83 ta sẽ lấy được tương đối mốc của
rất nhiều ảnh điểm và từ các giá trị màu ở mức thấp nhất của các mốc đó ta
có thể lấy ra các màu chính xác của các điểm tô Khoảng màu để lọc các
điểm tô được tính như sau:
Trang 24Maxcolor = mincolor + 45
Với cách tính khoảng màu như trên thì ta có thể giải quyết vấn đề lọc
màu tốt hơn lấy một khoảng màu lớn và độ lọc màu chính xác hơn đối với
từng bức ảnh, khi đó với những bức ảnh được scan với những máy sacn khác
nhau thì ta sẽ tính ra được những khoảng màu khác nhau Do đó các khoảng
màu của ta có tính chất động và giá trị của nó sẽ phụ thuộc vào bản thân
của từng bức ảnh ( phụ thuộc vào giá trị của mốc)
2.4 Xây dựng giải thuật :
2.4.1 Mô tả giải thuật :
Giải thuật xử lý màu trong bảng điểm được thực hiện như sau: khi đọc dữ
liệu để xác định mốc từ file ảnh ta tiến hành xác định khoảng màu nhỏ nhất
trong mốc đó
Khi có được giá trị khoảng màu được tính như công thức ở trên, ta đưa
khoảng màu đó làm dữ liệu cho bộ lọc Sau đó ta sẽ tiến hành đọc dữ liệu
và so sánh dữ liệu đó có thuộc vào khoảng màu mà ta đã tính toán trước
nếu trùng vào những khoảng màu nào thí ta chuyển dữ liệu của file ảnh đó
về một màu chuẩn ta đã tính trước Nếu bức ảnh ta có nhiều màu thì ta phải
so sánh với lần lược với nhiều khoảng màu tương ưng với những màu đó
Sau đây là quá trình để lấy được khoảng màu lọc:
Đọc khoảng ảnh có mốc
Tìm giá trị min của khoảng màu có mốc đó
Tính khoảng màu cận trên theo công thức
Maxcolor = mincolor + 45
Đọc khoảng ảnh để xác định điểm đen
Lấy khoảng màu đã tính được ở trên đưa vào bộ lọc
Dùng bộ lọc đó để lọc các màu của khoảng ảnh có điểm tô đen
Trang 252.4.2 Lưu đồ giải thuật :
Begin
End
Dữ liệu ảnh
So sánh dữ liệu ảnh với
khoảng màu tính trước
Đưa dữ liệu
màu về 1
Đúng
Đưa dữ liệu màu về 0 Sai
2.5 Đoạn chương trình minh hoạ :
Sau đây là đoạn chương trình mô tả bộ lọc màu
Hàm gồm có hai tham số đưa vào là data và maxcolor với ý nghĩa của
các tham số như sau:
Data : có kiểu số nguyên chưa dữ liệu màu của pixel cần lọc
Maxcolor : khoảng cân trên của bộ lọc
Hàm trả về giá trị là dữ liệu đã lọc được có hai giá trị như sau : giá trị 0
hoặc 1 tương ứng, với giá trị 1 là màu trong khoảng màu cần lọc và ngược
lại là những màu không quan tâm
int filter(int data, int maxcolor) {
if(data>=0 && data<=maxcolor) return 1;
return 0;
}
Trang 26x’=x + tr x
y’=y + tr y
3 Quá trình xử lý ảnh bị biến đổi :
3.1 Tại sao phải xử lý ảnh bị biến đổi :
Trong thực tế một ảnh từ máy scan cho ra thì không ảnh nào là giống
ảnh nào về màu sắc lẫn vị trí Nếu ta lấy một ảnh tương đối thẳng (ảnh ít bị
quay và tịnh tiến ) làm chuẩn để tính điểm và vị trí, khi đó nếu ta có một
ảnh bị biến đổi nhiều thì khi ta áp dụng ảnh chuẩn để tính điểm cho ảnh đó
thì kết quả ta thu được chắc chắn sẽ là một kết quả sai Do đó việc xử lý
biến đổi trước khi tính điểm là một điều cần thiết
3.2 Các loại biến đổi thường gặp trong file điểm :
Thực tế trong bài toán nhập điểm này chỉ có thể xảy ra ba loại biến đổi
thường gặp là biến đổi, quay và biến dạng Do người sử dụng gây ra như để
ảnh không ngay dẫn đến ảnh quay và tịnh tiến hoặc khi scan giấy bị gấp
nếp dẫn đến ảnh bị biến dạng Sau đây là các phép biến đổi đã được sử
dụng:
3.2.1 Phép tịnh tiến :
Để tịnh tiến một điểm P(x,y) từ vị trí này sang vị trí khác trong mặt
phẳng, ta cộng thêm một giá trị mô tả độ dời vào các toạ độ của P Nếu gọi
trx và try lần lượt là độ dời theo trục hoành và trục tung thì toạ độ điểm mới
Q(x’,y’) sẽ là :
{
(trx, try) còn được gọi là vector tịnh tiến hay là vector độ dời
Chúng ta có thể dịch chuyển toàn bộ một đối tượng bằng cách áp dụng
qui tắc trên cho mọi điểm thuộc đối tượng Để tịnh tiến một đoạn thẳng, đơn
giản chỉ cần tịnh tiến hai điểm đầu và cuối của nó rồi sau đó vẽ lại đoạn
thẳng nối hai điểm mới Với đa giác ta tịnh tiến các đỉnh của nó sau đó vẽ
lại đa giác với các đỉnh mới Một cách tương tự để tịnh tiến các đối tượng
như đường tròn, ellipse, ta tịnh tiến tâm của chúng tới vị trí mới rồi vẽ lại
0 0 1 1 1
x
Trang 273.2.2 Phép quay :
Phép quay làm thay đổi hướng của đối tượng Một phép quay đòi hỏi
phải có tâm quay, góc quay Góc quay dương thường được quy ước là chiều
ngược kim đồng hồ Ta có công thức biến đổi của phép quay điểm P(x,y)
quanh gốc tọa độ một góc :
y
y x
x
cos
sin
'
sin
Phép quay quanh một tâm :
Giả sử tâm quay có toạ độ I(x R, y R) ta có thể xem phép quay quanh tâm I
một góc được kết hợp từ phép biến đổi cơ sở sau:
Tịnh tiến theo vector tịnh tiến (-x R , -y R ) để dịch chuyển tâm quay về
gốc toạ độ (đưa về trường hợp quay quanh gốc tọa độ)
Quay quanh gốc toạ độ một góc
Tịnh tiến theo vector tịnh tiến (x R ,y R ) để đưa tâm quay về lại vị trí
0 0 1 1 0 0
0 cos sin
0 sin cos
1
0 1
0
0 0
1
R R R
1 sin
sin cos
1
0 cos
sin
0 sin
cos
R R
3.2.3 Phép biến dạng :
Phép biến dạng là phép biến đổi làm thay đổi, méo mó hình dạng các
đối tượng Hai dạng phép biến dạng thường gặp đó là biến dạng theo
phương trục x và biến dạng theo phương trục y bằng cách thay đổi toạ độ
(x,y) của điểm ban đầu theo cách sau :
Biến dạng theo phương trục x sẽ làm thay đổi hoành độ còn tung độ vẫn
0 1
0 0 1
xy
M
Trang 28Biến dạng theo phương trục y sẽ làm thay đổi tung độ còn hoành độ vẫn
0 1 0
0
Shx
sh M
xy
sh vàsh yx lần lượt được gọi là các hệ số biến dạng
3.3 Tại sao chỉ xử lý biến đổi quay :
Trong thực tế ta thấy trong ba phép biến đổi trên chỉ có phép biến đổi
tịnh tiến và quay là thường xảy ra nhất và thực tế là như vậy Do đó ta
không cần phải xử lý vấn đề biến dạng ảnh mà nếu ta xử lý vấn đề này thì
theo những công thức ở trên ta có được ba hệ phương trình dẫn đến ta sẽ
giải ra được 6 ẩn mà trên bảng điểm của ta chỉ có hai mốc nên ta chỉ có
được 4 ẩn do đó muốn xử lý quá trình biến dạng của ảnh ta phải cần thêm
một mốc thứ ba dẫn đến ta phải thiết kế lại bảng điểm đã có sẵn để nó có
thêm một mốc nữa Mà vấn đề ảnh bị biến dạng rất ít khi xảy ra cho nên ta
có thể bỏ vấn đề ảnh bị biến dạng
Ta cũng có thể bỏ luôn vấn đề về tịnh tiến ảnh vì nếu ta tịnh tiến ảnh về
vị trí mốc chuẩn và sau đó ta mới quay thì cách đó là chính thống Nhưng
nếu ta xem mốc tìm được là mốc chuẩn và sau đó sẽ quay ảnh về vị trí
chuẩn so với mốc tìm được đó thì ta vẫn giải quyết được vấn đề mà lại thực
hiện ít phép toán hơn
Do những lý do trên nên tiền xử lý ta chỉ cần xử lý ảnh bằng một phép
quay để đưa ảnh về dạng ảnh chuẩn theo vị trí của mốc một
3.4 Các giải pháp để xử lý một ảnh quay :
Để giải quyết vấn đề quay ảnh này đã phát sinh ra hai giải pháp để xử lý
vấn đề trên sau đây là việc mô tả hai cách giải quyết
Giải pháp 1: Từ một ảnh ban đầu ta sẽ quay toàn bộ bức ảnh về vị trí
chuẩn để cho ra một bức ảnh mới hoàn toàn giống với bức ảnh chuẩn và
sau đó ta mới tiến hành xử lý điểm trên bức ảnh hoàn toàn giống với bức
ảnh chuẩn đó Cách giải quyết này hoàn toàn khả thi vì từ một bức ảnh
ta có thể sao chép ra một bức ảnh mới hoàn toàn và nó làm đơn giản hóa
vấn đề cho ta trong quá trình xử lý điểm vì khi ảnh hoàn toàn giống ảnh
chuẩn thì ta xử lý chúng rất nhẹ nhàng do tọa độ đọc ảnh hoàn toàn cố
định Nhưng nó có một khuyết điểm là chương trình ta sẽ rất chậm vì khi
quay toàn bộ bức ảnh để cho ra một bức ảnh mới ta phải đọc qua toàn bộ
bức ảnh cũ Mà như ta đã biết một ảnh điểm dạng bitmap thì rất lớn do
đó khi đọc nó sẽ rất chậm và sau khi quay xong ta còn phải xử lý việc
Trang 29đọc tiếp ảnh để lấy điểm và vị trí, dẫn đến ta phải đọc ảnh đó gần như
hai lần Do đó ta sẽ không chọn giải pháp này để giải quyết vấn đề quay
ảnh như đã nói
Giải pháp 2: Từ ảnh ban đầu ta tính toán được góc quay và ma trận
quay Ta phải tính toán trên thực tế xem ảnh quay bao nhiêu độ thì
khoảng đọc ảnh mà có toàn bộ các điểm đen cần thiết Sau đó đọc để
tìm các điểm đen trong phần ảnh đó và lấy tâm của điểm đen đó sau đó
ta mới quay tâm đó về vị trí chuẩn theo ma trận quay, rồi mới tính điểm
Cách giải quyết này rất phức tạp và không thể giải quyết được hoàn toàn
đối với những góc quay lớn (trên 7) nhưng chương trình sẽ chạy nhanh
và ích tốn bộ nhớ vì số lần đọc file ảnh rất ít và đọc xong là xử lý điểm
luôn Đối với bài toán này thì góc quay ảnh không lớn vì khe để ảnh của
máy Scan rất nho,û do đó khả năng quay của ảnh một góc lớn thì không
thể xảy ra Vì thế giải pháp này rất phù hợp để giải quyết bài quay ảnh
của chương trình này
3.5 Xây dựng giải thuật :
3.5.1 Tính góc quay :
3.5.1.1 Giải thuật tính góc quay :
Giải thuật tính góc của ảnh được mô tả như sau:
Từ toạ độ của điểm mốc một ta tính được toạ độ của điểm mốc
2 chuẩn bằng công thức:
Xmc2 = xmt1 + độ dời theo trục x từ mốc 1 đến mốc 2 trên ảnh chuẩn
Ymc2 = ymt1 + độ dời theo trục y từ mốc 1 đến mốc 2 trên ảnh chuẩn
Từ toạ độ của mốc 2 đọc được trên bức ảnh ta tiến hành áp
dụng công thức tính ma trận quay để tính khi ta có được điểm cần quay và vị trí khi đã quay đến Công thức để tính góc quay ( sin(a), cos(a) ) được tính như sao :
Sin (a) = (dy1*dx-dx1*dy) / (dy*dy+ dx*dx) Cos(a) = ((dx1)+s*dy)/(dx)
Trong đó:
dy= y – yt1 dx= x - xt1 dy’=y’- yt1 dx’=y’ – xt1 ( x,y) là toạ độ của điểm cần quay
và (x’,y’) là toạ độ của điểm cần quay đến
Trang 303.5.1.2 Lưu đồ giải thuật :
Begin
End
xmt1, ymt1 xmt2, ymt2
Tính mốc hai chuẩn theo mốc 1
Tính sin và cos theo CT
Sin (a) = (dy1*dx-x1*dy) / (dy*dy+ dx*dx)
Cos(a) = ((dx1)+s*dy)/(dx)
Sin(a) cos(a)
3.5.2 Tính ma trận quay :
3.5.2.1 Giải thuật tính ma trận quay :
Để tính được ma trân quay cần các thông tin sau:
Tâm quay
Góc quay
Aùp dụng lý thuyết về quay ảnh ở phần trên ta tính ma trận quay theo
công thức đó
Trang 313.5.2.2 Lưu đồ giải thuật :
Begin
End
Góc quay (c, s) tâm quay (xf, yf)
Tính ma trân quay theo công thức :
T[0][0]=c; T[0][1]=s ; T[0][2]=0;
T[1][0]=-s; T[1][1]=c ; T[1][2]=0;
T[2][0]=(1-c)*xf+yf*s; T[2][1]=(1-c)*yf-xf*s; T[2][2]=1;
3.5.3 Chuyển đổi toạ độ của một điểm theo ma trân quay :
3.5.3.1 Giải thuật chuyển toạ độ :
Để chuyển một một toạ độ về vị trí mới theo ma trận quay thì ta nhân
toạ độ đó với ma trận quay công thực được tính như sau:
X mới = T[0][0]* x cũ +T[1][0]* y cũ +T[2][0]
Y mới = T[0][1]* x cũ +T[1][1]* y cũ +T[2][1]
3.6 Đoạn chương trình minh hoạ :
3.6.1 Tính góc quay :
Hàm này có 8 thông số đưa vào là xf, yf, x, y, x1, y1, c, s với ý nghĩa
của mỗi tham số như sau :
xf, yf : toạ độ của góc quay (mốc 1)
x, y : toạ độ muốn quay (mốc 2 đọc từ ảnh)
x1, y1 : toạ độ muốn (mốc 2 chuẩn theo mốc 1)
Tham biến c, s : chưa giá trị của cos(a) và sin(a)
void cos_sin(int xf,int yf,int x,int y,int x1,int y1,float &c,float &s){
int dy,dx,dx1,dy1;
dy=y-yf; dx=x-xf;
dy1=y1-yf; dx1=x1-xf;
s=(dy1*float(dx)-dx1*float(dy))/(float(dy)*dy+float(dx)*dx);
Trang 32T: là một ma trận dùng để chứa các giá trị quay
c, s :biến chứa giá trị của cos(a) và sin(a)
xf, yf : toạ độ tâm quay
void rotation(matrix T,float c,float s,int xf,int yf){
3.6.3 Chuyển toạ độ theo ma trận quay :
Hàm chuyển toạ độ theo ma trận có 3 tham số đưa vào là x, y, T với ý
Trang 334 Xác định mốc :
4.1 Tại sao phải sử dụng mốc :
Nguyên nhân 1: Do ảnh Scan là một ảnh thủ công nó tuỳ thuộc vào
người nhập điểm và ảnh Scan Do đó ảnh Scan không ảnh nào là giống ảnh
nào về kích thước và vị trí của ảnh dẫn đến ta không thể nào xác định được
điểm chính xác của bảng điểm nhập vào Để tính được điểm chính xác ta
phải có được một toạ độ để các điểm khác lấy toạ độ đó làm chuẩn để xác
định được nó đang ở đâu so với toạ độ đó Toạ độ được nói đến được gọi là
mốc để các toạ độ khác tham chiếu đến nghĩa là toạ độ các điểm sẽ được
tính dựa vào toạ độ mốc Đối với bài này thì mốc đó được gọi là mốc 1 (nằm
ở góc trái trên)
Nguyên nhân 2: Do người nhập điểm đặt bảng điểm không thẳng dẫn
đến ảnh điểm sẽ bị quay hoặc tịnh tiến do đó các toạ độ điểm tô không còn
thẳng hàng so với toạ độ mốc 1 cho nên khi ta tính điểm và vị trí sẽ không
còn chính xác nữa Điều này dẫn đến việc ta phải có thêm một mốc nữa để
xác định được góc quay của ảnh từ đó tất cả các điểm sẽ được quay về vị trí
chuẩn so với vị trí mốc 1 Mốc được nói ở trên ta gọi là mốc 2 (nằm ở vị trí
góc phải dưới của ảnh)
Nguyên nhân 3: Do có rất nhiều loại máy Scan mà mỗi máy Scan sẽ cho
những khoảng màu hoàn toàn khác nhau nên không thể biết được chính xác
khoảng màu của các điểm tô đó Do đó khi ta dựa vào khoảng màu của mốc
1 ta sẽ suy ra được khoảng màu của các điểm tô
Ba nguyên nhân trên cho ta thấy tầm quan trọng của việc xác định mốc
để giải quyết bài toán này Đó là ba lý do chính cho ta thấy được vấn đề tại
sao phải xác định mốc
4.2 Xác định các khoảng ảnh có thể xác định được mốc :
Do bảng điểm có kích thước rất lớn, có rất nhiều phần ảnh nếu ta kiểm
tra tất cả các phần ảnh để tìm ra mốc thì chương trình của ta sẽ phải đọc ảnh
rất nhiều để tìm được mốc dẫn đến chương trình có thể sẽ thực thi rất chậm
và không ổn định Mà trên thực tế thì chỉ có một khoảng điểm là có khả
năng có mốc Đó là lý do ta phải xác định khoảng điểm có mốc
Vấn đề của chương này đề ra là làm sao xác định được tương đối chính
xác tâm của điểm mốc Muốn xác định tương đối chính xác tâm của điểm
mốc ta phải biết được khoảng điểm mà có mốc, và phải xác định khoảng
điểm đó nằm ở đâu trên bức ảnh Như ta đã biết, bảng điểm có hai mốc
nằm ở vị trí trái trên và phải dưới của bảng điểm nhưng khi Scan cho ra ảnh
điểm thì do ảnh có thể bị tịnh tiến, quay nên điểm mốc cũng không nằm tại
một vị trí cố định mà sẽ nằm ở vị trí tuỳ thuộc vào ảnh bị quay bao nhiêu và
Trang 34tịnh tiến bao nhiêu Vấn đề ở đây là ta phải tìm ra được những vị trí nào mà
mốc xuất hiện khi ảnh quay và tịnh tiến trong khả năng bài toán cho phép
Để giải quyết vấn đề trên ta phải qua thực nghiệm đối với mọi khả năng
có thể xảy ra đối với bài toán để tìm ra được khoảng ảnh để xác định được
mốc Qua thực nghiệm tính được khoảng điểm có khả năng xác định được
mốc 1 nằm trong khoảng (0,0) đến (200,200) và khoảng ảnh có khả năng
xác định được mốc 2 nằm trong khoảng ( w-100 , ymt1+743 ) đến ( w ,
ymt1+843 ) với w là chiều rộng của ảnh và ymt1 toạ độ y của mốc 1
4.3 Giải pháp để xác định tâm của một mốc :
Giải pháp để xác định tâm của một mốc được mô tả như sau:
Tìm tuần tự trên phần ảnh có mốc, nếu phát hiện ra điểm đen thì dừng
lại và kiểm tra xem điểm đen đó có thuộc mốc hay không nếu có thì xác
định tâm của mốc và ngưng việc tìm mốc, nếu không phải là mốc thì tiếp
tục tìm điểm đen trên phần ảnh đó
Có hai phương pháp để thực hiện việc kiểm tra một điểm đen có thuộc
mốc hay không được mô tả như sau:
Giải pháp 1: Phương pháp quét hình chữ thập
Khi ta phát hiện ra một pixel đen, từ pixel đen đó ta quét ngang tìm xem
trên dòng pixel đen đó có bao nhiêu pixel đen, sau đó ta lấy pixel đen ở
giữa các pixel đen trên hàng đó, sau đó ta tiến hành quét theo cột tại vị trí
của pixel đen giữa đó để tìm xem trên cột đó có bao nhiêu pixel đen Nếu
số pixel đen trên cột đó nằm trong khoảng từ 12 đến 14 pixel thì ta mới tiếp
tục công việc kiểm tra, sau đó lấy điểm giữa của các pixel trên trên cột đó
và tiếp tục quét ngang qua hai bên để tìm số pixel đen ở hai bên Nếu số
pixel đen ngang đạt được từ 12 dến 14 pixel thì dừng và khẳng định pixel
đen ở trên là pixel thuộc mốc, từ đó suy ra tâm của điểm đen là điểm giữa
của dòng và cột
Giải pháp này có một ưu điểm là số lần kiểm tra một pixel đen có thuộc
mốc rất ít dó đó chương trình sẽ kiểm tra rất nhanh, nhưng nó có một khuyết
điểm là rất dễ dẫn đến sai lầm trong việc nhận dạng mốc do trong ảnh điểm
có rất nhiều thứ thoả mãn với cách quét hình chữ thập
Giải pháp 2: Phương pháp quét đóng khung
Khi ta phát hiện ra điểm đen, thì từ pixel đen đó ta sẽ quét theo hàng
ngang 14 pixel tìm xem trên dòng pixel đen đó có bao nhiêu pixel đen, sau
đó ta dùng một công thức sau để tính biên đặt khung quét:
xcd = xcd – (14 – so pixel đen trên dòng đó)/2
Sau khi biết được biên để đặt khung ( khung có chiều rộng 14 pixel và
chiều ngang 14 pixel ) ta tiến hành quét trong khung lần lượt từ trên xuống
Trang 35để tìm tổng số điểm đen, sau khi quét hết khung ta tiến hành kiểm tra tổng
số pixel trong khung đó Nếu tổng số pixel đen trong khung đạt được từ 100
đến 196 pixel đen thì ta xác định pixel đen đó là pixel đen của mốc Sau đó
ta tiến hành xác định tâm của mốc và ngưng việc kiểm tra Nếu không phải
là pixel đen của mốc thì ta tiến hành quét và để tìm số pixel để kiểm tra
Giải pháp này có một ưu điểm là nó xác định pixel đen thuộc mốc rất
chính xác và ít khi bị lầm lẫn trong việc nhận dạng, nhưng cũng có khiếm
khuyết là phải kiểm tra quá nhiều điểm mới xác nhận được một pixel đen
có thuộc mốc hay không Ta cũng có thể khắc phục được phần nào giải
pháp này bằng cách tạo thêm một số điều kiện để loại trừ những pixel đen
không thuộc mốc
Kết luận:
Trong hai giải pháp trên ta nhận thấy giải pháp một rất phức tạp mà độ
chính xác không cao do nó rất dễ kiểm tra nhầm lẫn mốc Mà chương trình
của ta đòi hỏi việc xác định mốc phải chính xác Còn giải pháp thứ hai thì
tương đối chính xác hơn nhưng chương trình sẽ phải quét nhiều hơn Do
những ưu khuyết điểm của hai giải pháp trên ta thấy việc chọn giải pháp 1
là không khả thi vì độ chính xác của giải pháp này không cao Vì vậy ta sẽ
chọn giải pháp 2 để giải quyết vấn đề nhận dạng mốc của bài toán này
4.4 Xây dựng giải thuật :
Từ ưu điểm và khuyết điểm của hai giải pháp trên ta đi đến quyết định
chọn giải pháp 2 để xây dựng giải thuật xác định mốc Giải thuật chia làm
hai phần: phần đầu xác định mốc trong một khoảng điểm và phần hai xác
định một pixel đen có thuộc một mốc hay không Giải thuật được mô tả như
sau:
4.4.1 Xác định mốc có trong một khoảng điểm :
4.4.1.1 Giải thuật :
Giải thuật xác định mốc được mô tả như sau:
Bước 1: Đi theo chiều từ trên xuống của khoảng điểm
Bước 2: Đi theo chiều từ trái qua phải của khoảng điểm
Bước 3: Nếu phát hiện pixel đen thì kiểm tra xem pixel đen đó có
thuộc mốc hay không
Nếu có thì lấy tâm của mốc và thoát Nếu không thì quay lại bước 1, bước 2 i= 0
j= 0
Trang 36While ( i< height)
Begin While (j<width) Begin
if( pixel[i][j] =1) then if(xacdinhdiemmoc( j, i, width, height, pixel, x, y)) then begin
xm = x
ym = y exit end j=j+1 End i=i+1 End