http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
Lời nói đầu
.CO
Chương I. TỔNG QUAN VỀ PHÂN TÍCH ẢNH
M
MỤC LỤC
1.Khái quát về biên và phân loại các kỹ thuật dò biên
1.1. Khái niệm về biên
1.2. Phân loại các kỹ thuật phát hiện biên
OKS
2. Quá trình phát hiện biên
Chương II. CÁC PHƯƠNG PHÁP DÒ BIÊN
1. Sự phân đoạn và dò biên
1.1. Thao tác vùng
1.2. Dò biên thô
1.3. Kết hợp các vùng
OBO
2. Các phương pháp dò biên cơ bản
2.1. Phép lấy đạo hàm bậc nhất cho phương pháp dò biên
2.2. Phương pháp dò biên Sobel
2.3. Phép toán được quan tâm khác
3. Dò bậc hai
3.2. Dò biên màu
KIL
3.1. Xác định cắt điểm không
4. Phương pháp dò biên Phương pháp dò biên Laplace
5. Phương pháp dò biên hình chóp(pyramid EDGE detection)
6. Crack edge relation(Tách giới hạn biên)
7. Kỹ thuật đạo hàm tích chập – phương pháp Canny
8. Dò biên theo quy hoach động
8.1. Mô tả phương pháp
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
8.2. Thuật toán
.CO
Lời nói đầu
M
9. Một số thuật toán khác
Xử lý ảnh là một lĩnh vực đang được quan tâm và đã trở thành một môn học
chuyên ngành của sinh viên hệ kĩ sư, hệ cử nhân ngành công nghệ thông tin, cũng
như những ngành kĩ thuật khác trong các trường đại học kĩ thuật.Xử lý ảnh có liên
OKS
quan đến nhiều ngành khác như: Hệ thống tin học, lý thuyết thông tin, lý thuyết
thống kê, trí tuệ nhân tạo, nhận dạng, v.v…Xử lý ảnh nghiên cứu tất cả những gì
liên quan đến việc thao tác trên ảnh như: Biểu diễn ảnh, thu nhận ảnh, tăng cường
và khôi phục ảnh nhằm thu được ảnh như mong muốn.Mỗi vấn đề đều cần có
những xử lý về thuật toán tại mỗi điếm ảnh hay phần tử ảnh. Việc tìm hiểu giúp
OBO
chúng ta hiểu sâu hơn về cơ chế, nguyên tắc xử lý ảnh, điều chỉnh màu, độ sáng tối,
độ tương phản,… làm cho hình ảnh đẹp và nghệ thuật hơn. Do đó xử lý ảnh là lĩnh
vực được rất nhiều quan tâm và trở thành niềm đam mê của rất nhiều sinh viên.
Trong bài báo cáo này, em xin đưa ra đề tài: Các phương pháp dò biên ảnh. Đặc
biệt ở đây trình bày 2 thuật toán dò biên Sobel và Laplace bằng ngôn ngữ C. Để đạt
được thành công, chúng ta cần sự nghiên cứu và trao đổi lẫn nhau. Vì vậy em rất
thành cảm ơn!
KIL
mong sự tham gia của các bạn, đặc biệt là lời nhận xét của cô giáo. Em xin chân
http://kilobooks.com
OKS
.CO
M
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
OBO
Chương I. TỔNG QUAN VỀ PHÂN TÍCH ẢNH
Sau giai đoạn tiền xử lý ảnh, ảnh đã dược tăng cường hay khôi phục để làm nổi
các đặc trưng chủ yếu.Giai đoạn phân tích ảnh gồm: trích chọn các đặc tính, sau đó
phân đoạn ảnh thành các phần tử.Ví dụ như phân đoạn dựa theo biên, dựa theo
vùng. Tùy theo các ứng dụng, giai đoạn tiếp theo có
thành các lớp có miêu tả.
thể là nhận dạng ảnh phân
KIL
Sơ đồ sau mô tả tóm lược các bước của quá trình phân tích ảnh:
Ảnh đầu ra của
Trích chọn
đặc tính
Phân
đoạn
Phân loại
Giải thích
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
M
Quá trình tiền xử lý
.CO
Sơ đồ: Các bước phân tích ảnh.
OKS
Các đặc trưng của ảnh thường gồm: mật độ xám, phân bố xác suất, phân bố không
gian, biên ảnh.
1. Khái quát về biên và phân loại các kỹ thuật dò biên.
1.1. Khái niệm về biên:
OBO
Biên là một vấn đề chủ yếu trong phân tích ảnh vì các kỹ thuật phân đoạn ảnh chủ
yếu dựa vào biên.Một điểm ảnh có thể coi là điểm biên nếu ở đó có sự thay đổi đột
ngột về mức xám.Tập hợp các điểm biên tạo thành biên hay đường bao của ảnh.Ví
dụ: trong một ảnh nhị phân, một điểm có thể gọi là biên nếu nó là điểm đen và có ít
nhất một điểm trắng lân cận.
Để hình dung tầm quan trọng của biên ta xét ví dụ sau: Khi người hoạ sĩ vẽ một
KIL
cái bàn gỗ, chỉ cần vài nét phác thảo về hình dáng như mặt bàn, chân bàn mà
không cần thêm các chi tiết nào khác, người xem đã có thể nhận ra cái bàn.Nếu ứng
dụng của ta là phân lớp nhận diện đối tượng thì coi như nhiệm vụ đã hoàn
thành.Tuy nhiên nếu đòi hỏi thêm về các chi tiết khác như vân gỗ hay màu sắc…
thì với chừng ấy thông tin là chưa đủ.Nhìn chung về mặt toán học người ta coi
điểm biên của ảnh là điểm có sự biến đổi đột ngột về độ xám.
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
Như vậy, phát hiện biên một cách lý tưởng là xác định được tất cả cả các đường
bao trong đối tượng. Định nghĩa toán học của biên ở trên là cơ sở cho các kỹ thuật
phát hiện biên. Điều quan trọng là sự biến thiên mức xám giữa các điểm ảnh trong
khá hơn.
.CO
1.2. Phân loại các kỹ thuật phát hiện biên
M
một vùng thường là nhỏ, trong khi đó biến thiên mức xám của điểm giáp ranh lại
Xuất phát từ định nghĩa toán học của biên người ta thường sử dụng 2 phương pháp
phát hiện biên sau:
- Phương pháp phát hiện biên trực tiếp: Phương pháp này nhằm làm nổi biên
dựa vào sự biến thiên về giá trị độ sáng của điểm ảnh.Kỹ thuật chủ yếu dùng
OKS
phát hiện biên ở đây là kỹ thuật đạo hàm.Nếu lấy đạo hàm bậc nhất của ảnh, ta
có phương pháp Gradient.Nếu lấy đạo hàm bậc hai, ta có phương pháp
Laplace.Hai kỹ thuật trên gọi là phương pháp dò biên cục bộ.Ngoài ra, người ta
cũng sử dụng phương pháp “đi theo đường bao” : dựa vào nguyên lý quy hoạch
động và được gọi là phương pháp dò biên tổng thể.
Phương pháp phát hiện biên gián tiếp: Bằng cách nào đó, ta phân được ảnh
OBO
-
thành các vùng thì đường phân ranh giữa các vùng đó chính là biên.Việc phân
vùng ảnh thường dựa vào kết cấu bề mặt ảnh.
Kỹ thuật dò biên và phân vùng ảnh là hai bài toán đối ngẫu của nhau.Thực vậy, dò
biên để thực hiện phân lớp đối tượng và một khi đã phân lớp xong có nghĩa là đã
phân vùng được ảnh.Và ngược lại, khi đã phân vùng, ảnh đã phân lập được thành
KIL
các đối tượng, ta có thể phát hiện được biên.Phương pháp dò biên trực tiếp tỏ ra
khá hiệu quả vì ít chịu ảnh hưởng của nhiễu.Nếu biến đổi gián tiếp tuy khó cài đặt,
song lại áp dụng khá tốt khi sự biến thiên độ sáng nhỏ.
2.Quá trình phát hiện biên
-Vì ảnh thu nhận thường có nhiễu nên bước đầu tiên là khử nhiễu.
-Tiếp theo là tiến hành làm nổi biên bởi các toán tử đạo hàm.
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
- Định vị điểm biên.Vì các kỹ thuật làm nổi biên có hiệu ứng phụ là tăng
nhiễu,
do vậy sẽ có một điểm biên giả cần bị loại bỏ.
Chương II.Các phương pháp dò biên
1.Sự phân đoạn và dò biên
1.1.Thao tác vùng
.CO
M
-Liên kết và trích chọn biên.
OKS
Việc khám phá các vùng có thể là một việc rất đơn giản ,như được minh hoạ trong
mục 1.1.1.tuy nhiên thường không nhiều hơn ,những vùng được yêu cầu mà bao
trùm một vùng thật của ảnh hơn là mổh nhóm các diểm ảnh.
1.2.Dò biên thô
Sử dụng: xem xét một hình ảnh như là một tập hợp các vùng .
OBO
thuật toán:dò biên thô không phải là một phương pháp phức tạp .những vùng đơn
giản được xác định như vùng các điểm cùng mức xám , đường biên của các vùng là
tách những điểm ảnh hơn tại vị trí điểm.
như việc dò một vùng có thể đưa ra một số các vùng hữu ích (trừ khi số các mức
xám là tương đối nhỏ ).như vậy một phương pháp đơn giản là nhóm lại những điểm
ảnh vào trong hững phạm vi của những giá trị gần (q hoặc tự nhóm).các
KIL
vùng(miền) có thể là việc xem xét các biểu đồ hình ảnh để xác định tốt sự tự
nhhóm cho mục đích vùng kết quả trong việc kết hợp toàn bộ mức xám vùng cơ sở
nhiều hơn các mức xám của điểm ảnh mà nó gần với một vùng khác .
1.3. Kết hợp các vùng
Việc kết hợp các vùng là rất hữu ích cho việc tách thô các mức xám và thực hiện
một số kỹ thuật trên những vết rạn giữa những vùng_không làm tăng biên nhưng để
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
xác định khi toàn bộ các vùng cần phải nối (kết hợp_-như vậy làm giảm số các
vùng từ việc tìm vùng thô ở trên .
2. Các phương pháp dò biên cơ bản
M
Biên của một hình ảnh giữ nhiều thông tin trong hình ảnh đó .các biên cho biết các
đối tượng ở đâu ,hình dạng và kích thước của đối tượng,và cái gì đó để kết cấu của
.CO
đối tượng .biên là nơi cương độ của một hình ảnh di chuyển từ một giá trị thấp đến
giá trị cao.
Rất nhiều các ứng dụng cho phương pháp dò biên ,mà được sử dụng cho một số
hiệu ứng đặc biệt .những nghệ sỹ kỹ thuật số sử dụng nó để làm rõ nét các đường
nét của hình ảnh .kết quả của việc dò biên có thể đưa thêm vào hình ảnh để làm nổi
OKS
bật các đường biên.
Biên trong ảnh là những vùng có cường độ tương phản mạnh, một bước nhảy từ
điểm ảnh tới điểm ảnh kế tiếp.Dò biên một ảnh giúp giảm đáng kể số lượng và lọc
ra những thông tin không hữu ích, trong khi đó bảo quản được các thuộc tính cấu
trúc của ảnh.Có rất nhiều cách thực hiện dò biên.Tuy nhiên các phương pháp chính
OBO
khác nhau có thể được nhóm vào thành hai loại, Gradient và Laplacian.Phương
pháp Gradient dò biên bằng cách tìm kiếm giá trị lớn nhất và giá trị nhỏ nhất trong
đạo hàm bậc nhất của ảnh.Phương pháp Laplace tìm kiếm các vạch không trong
đạo hàm bậc hai của ảnh để tìm biên.Biên có dạng một chiều và tính toán đạo hàm
của ảnh có thể làm nổi vị trí đó.Chúng ta có thể sử dụng kí hiệu f(t) sau với biên chỉ
KIL
ra bước nhảy của cường độ bên dưới:
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
M
Nếu ta lấy gradient của kí hiệu này ở dạng một chiều, chỉ ra đạo hàm bậc một của
OBO
OKS
.CO
biến t, ta nhận được:
Rõ ràng đạo hàm bậc một cho xác định giá trị lớn nhất tại tâm của biên.Phương
pháp xác định biên này là đặc trưng của nhóm lọc gradient nếu giá trị của gradient
vượt quá vài ngưỡng.Như đã đề cập, biên sẽ có giá trị cường độ điểm ảnh cao hơn
so với các vùng khác.Nên mỗi lần, một ngưỡng được đặt, ta có thể so sánh giá trị
gradient với giá trị một ngưỡng và dò biên khi mà ngưỡng được mở rộng.Hơn nữa
KIL
khi mà đạo hàm bậc nhất đạt giá trị lớn nhất, đạo hàm bậc hai bằng 0.Một cách
khác để tìm ra vị trí của biên là xác định các giá trị 0 của đạo hàm bậc hai của hàm
bên dưới:
http://kilobooks.com
.CO
M
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
Phương pháp dò biên thường bước đầu tiên là việc phân vùng hình ảnh .phân vùng
ảnh là một lĩnh vực của phân tích ảnh , được sử dụng đểvnhóm những điểm vào
trong các vùng để xác định thành phần cấu tạo một ảnh .
một ví dụ phổ biến của phân vùng ảnh là”magic wand”( đũa thần ma thuật )công cụ
OKS
phần mền trong xử lý ảnh .công cụ này cho phép người dùng lựa chọn một diểm
trong một hình ảnh .phần mền này vẽ một đường bao quanh những điểm có giá trị
giống nhau.người dùng có thể lựa chọn một diểm trong vùng bầu trời và đuã thần
ma thuật sẽ vẽ một đường bao kín vùng bầu trời trong ảnh .người dùng có thể sửa
đổi màu của vùng trời mà không gây ra sự biến đổi màu cắc các dãy núi hoặc bất
OBO
cứ phần nào có mặt trong hình ảnh .
phương pháp dò biên cũng sử dụng đăng ký (registration) ảnh .việc đăng ký hình
ảnh sắp thẳng hàng hai hình ảnh mà có thể thu đựoc tại các phần mền riêng biệt
KIL
hoặt từ những phân tử nhảy khác nhau.
roof edge
line edge
step edge ramp edge
Hình1.1 Một số đường biên khác nhau.
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
Có rất nhiều các kiểu biên,về chiều và hình dạng (hình1.1).Một số biên là đường
thẳng trong khi những biên khác được uốn cong bằng việc thay đổi giá trị radian.có
rất nhiều phương pháp dò biên sử dụng tất cả ngững đường biên trên,từng cái có
M
những điểm mạnh của riêng nó .một vài phương pháp dò biêncó thể sử dụng tốt
trong một số ứng dụng và thực hiện kém (không hiệu quả)trong ứng dụng khác.
.CO
Đôi khi nó được sử dụng thí nghiệm để xác định đâu là phương pháp dò biên tốt
nhất cho một ứng dụng.
Phương pháp dò biên đơn giản nhất và nhanh nhất là xác định giá trị cực đằit một
loạt các phép thuần nhất (đồng nhất)trừ điểm ảnh.phép toán trừ mỗi 8 điểm ảnh phụ
cận (vây quanh)từ một điểm trung tâm của một cửa sổ 3x3 trong hình 1.2 đầu ra
OBO
OKS
của phép toán là giá trị tuyệt đối cực đại của mỗi phần khác nhau.
homogenety operator
KIL
Phép toán đồng nhất
11
13
15
16
11
11
16
12
11
image
ảnh
Hình 1.2 sử dụng các thuật toán đồng nhất.
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
điểm ảnh mới=max{|11-11|,|11-13|,|11-15|,|11-16|,|11-11|,|11-16|,|11-12|,|11-11|}=5
Tương tự thuật toán thuần nhất là thiết bị dò biên khác .các thao tác của nó nhanh
M
hơn bởi vì nó chỉ phụ thuộc vào 4 phép trừ mỗi điểm ảnh khác với thuật toán thuần
nhất cần 8 phép trừ.các phép trừ là phần trên trái -phần dưới phải,giữa trái -giữa
.CO
phải ,dưới trái –trên phải ,và giá trị giữa trên-giá trị dưới ở giữa(hình1.3)
13
15
16
11
11
OKS
11
12
16
homogenety operator
image
ảnh
OBO
Thuật toán thuần nhất
11
KIL
Hình 1.3 Sử dụng thuật toán khác.
điểm ảnh mới=max{|11-11|,|13-12|,|15-16|,|11-16|}=5
2.1. Phép lấy đạo hàm bậc nhất cho phương pháp dò biên.
Nếu chúng ta đang tìm kiếm mọi đường biên nằm ngang nào nó sẽ nhận được tính
toán sự khác nhau giữa một giá trị điểm và giá trị điểm tiếp theo,hoặc lên trên hoặc
xuống từ đầu(được gọi là sự tách khác nhau)ví dụ giả thiết đỉnh trái gốc.
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
Hc=yk(x,y)=(x,y)-(x,y+1)
trên thực tế nó tương đương với việc thu nhỏ hình với mẫu 2x1
M
1
.CO
-1
Tương tự
Hr=Xk(x,y)=(x,y)-(x-1,y)
Sử dụng kết quả
OKS
-1 1
Hc và Hr là các giá trị xác định cột và dòng. Đôi khi nó rất tiện lợi để phát hoạ cả Xk
và Yk việc kết hợp chúng tạo nên độ lớn gradien(ví dụ cường độ của biên).việc kết
hợp chúng bằng việc gộp hoàn toàn chúng có thể cho giá trị trung bình hai biên loại
bỏ ngoài lẫn nhau(một là xác thực,một là không xác thực),vì vậy nó là tốt nhất cho
OBO
việc tính tổng các giá trị thực(không cần quan tâm đến dấu )hoặc tính tông các bình
phương của nó và khi đó có thể lấy căn bậc hai bình phương của kết quả thu được .
Nó cũng chia Xk bởi Yk và xác định một chiều gradien(góc của biên ở giữa các
vùng):
KIL
Y_difference(x, y)
gradient_direction = tan −1
X_difference(x, y)
Độ lớn có thể tính bằng tổng vectơ Hc và Hr:
H ( x, y) = H 2r ( x, y) + H c2 ( x, y)
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
Đôi khi cho việc tính toán đơn giản , độ lớn được tính là:
M
H( x, y) = H r ( x, y) + H c ( x, y)
H c (x, y )
H r (x, y )
OKS
θ = tan −1
.CO
Việc định hướng biên có thể tìm bởi
trong hình ảnh thực tế ,các hàng ít khi được định nghĩa tốt như vậy,thường thì sự
thay đổi giữa các vùng là từ từvà sặc sỡ hơn.
Hình ảnh sau đây là điển hình việc đọc biên.mẫu này đã càn để tính tỷung bình
0 0 0 0 0 0 2 0 3 3
0 0 0 1 0 0 0 2 4 2
0 0 2 0 3 4 3 3 2 3
0 0 1 3 3 4 3 3 3 3
0 1 0 4 3 3 2 4 3 2
0 0 1 2 3 3 4 4 4 3
OBO
gradien thông qua một số các điểm ảnh ,hơn là việc tính toán với hai con số
KIL
Các toán tử đạo hàm được áp dụng khá nhiều. Ở đây ta chỉ xét một số toán tử tiêu
biểu: Robert, Sobel,…
2.2. Phương pháp dò biên Sobel
Toán tử sobel nhạy cảm với các biên chéo hơn so với các biên thẳng đứng và các
biên nằm ngang.chuẩn sobel 3x3 thương đựoc sử dụng như:
X
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
M
−1 −2 −1
0 0 0
1 2 1
Y
.CO
−1 0 1
−2 0 2
−1 0 1
ảnh gốc :
0
0
0
0
0
0
2
1
0
1
0
3
0
0
2
3
0
0
4
4
2
0
3
3
0
2
3
3
3
4
2
3
OKS
0
0
0
0
3
2
3
3
0 1 0 4 3 3 2 4 3 2
0 0 1 2 3 3 4 4 4 3
OBO
|A|+|B|
4 6 4 10 14 12 14 4
6 8 10 20 16 12 6 0
4 10 14 10 2 4 2 4
2 12 12
2
4
8
0 0 0 0 1 1 1 1
2 0 0 1 1 1 0 0
0 0 1 0 0 0 0 0
KIL
giới hạn tại 12
2
0 1 1 0 0
0 0
8
http://kilobooks.com
M
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
.CO
Dựa trên phân tích một chiều, lý thuyết này có thể được áp dụng vào trường hợp
hai chiều, tính toán được chính xác xấp xỉ đạo hàm ảnh hai chiều.Toán tử Sobel
thực hiện phép đo gradient không gian hai chiều trong một ảnh. Điển hình nó được
sử dụng tìm ra giá trị tuyệt đối xấp xỉ độ rộng gradient tại mỗi điểm trong độ xám
OKS
ảnh đầu vào.Phương pháp dò biên Sobel sử dụng cặp mặt nạ xoắn 3X3, ước lượng
gradient theo cột x, hàng y.Một mặt nạ xoắn thường nhỏ hơn nhiều so với ảnh
thực.Mặt nạ là slide trên ảnh, thao tác thực hiện các điểm ảnh trên cùng một
KIL
OBO
lúc.Mặt nạ Sobel được chỉ ra ở hình dưới.
Độ dài đường dốc được tính bởi công thức:
Tính xấp xỉ:
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
|G| = |Gx| + |Gy|
.CO
FILE: edgeSob.c - WORKS!!
M
Mã của phương pháp dò biên Sobel :
AUTH: Bill Green
DESC: 2 3x3 Sobel masks for edge detection
DATE: 07/23/02
REFS: edgeLap.c
OKS
*/
#include
#include
#include
OBO
#include
/*-------STRUCTURES---------*/
typedef struct {int rows; int cols; unsigned char* data;} sImage;
/*-------PROTOTYPES---------*/
KIL
long getImageInfo(FILE*, long, int);
void copyImageInfo(FILE* inputFile, FILE* outputFile);
void copyColorTable(FILE* inputFile, FILE* outputFile, int nColors);
int main(int argc, char* argv[])
{
FILE
*bmpInput, *bmpOutput;
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
sImage
originalImage;
sImage
edgeImage;
X, Y;
I, J;
long
sumX, sumY;
int
nColors, SUM;
unsigned long
vectorSize;
unsigned long
fileSize;
int
GX[3][3];
int
GY[3][3];
unsigned char
*pChar, someChar;
row, col;
OKS
unsigned int
M
int
.CO
unsigned int
someChar = '0'; pChar = &someChar;
OBO
/* 3x3 GX Sobel mask. Ref: www.cee.hw.ac.uk/hipr/html/sobel.html */
GX[0][0] = -1; GX[0][1] = 0; GX[0][2] = 1;
GX[1][0] = -2; GX[1][1] = 0; GX[1][2] = 2;
GX[2][0] = -1; GX[2][1] = 0; GX[2][2] = 1;
/* 3x3 GY Sobel mask. Ref: www.cee.hw.ac.uk/hipr/html/sobel.html */
KIL
GY[0][0] = 1; GY[0][1] = 2; GY[0][2] = 1;
GY[1][0] = 0; GY[1][1] = 0; GY[1][2] = 0;
GY[2][0] = -1; GY[2][1] = -2; GY[2][2] = -1;
if(argc < 2) {
printf("Usage: %s bmpInput.bmp\n", argv[0]);
exit(0);
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
};
printf("Reading filename %s\n", argv[1]);
bmpInput = fopen(argv[1], "rb");
.CO
bmpOutput = fopen("edgeSob.bmp", "wb");
M
/*-------DECLARE INPUT & OUTPUT FILES-------*/
/*---SET POINTER TO BEGINNING OF FILE----*/
fseek(bmpInput, 0L, SEEK_END);
OKS
/*-------GET INPUT BMP DATA--------*/
fileSize = getImageInfo(bmpInput, 2, 4);
originalImage.cols = (int)getImageInfo(bmpInput, 18, 4);
originalImage.rows = (int)getImageInfo(bmpInput, 22, 4);
edgeImage.rows = originalImage.rows;
OBO
edgeImage.cols = originalImage.cols;
/*--------PRINT DATA TO SCREEN----------*/
printf("Width: %d\n", originalImage.cols);
printf("Height: %d\n", originalImage.rows);
KIL
printf("File size: %lu\n", fileSize);
nColors = (int)getImageInfo(bmpInput, 46, 4);
printf("nColors: %d\n", nColors);
/*------ALLOCATE MEMORY FOR FILES--------*/
vectorSize = fileSize - (14+40+4*nColors);
printf("vectorSize: %lu\n", vectorSize);
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
edgeImage.data = farmalloc(vectorSize*sizeof(unsigned char));
if(edgeImage.data == NULL) {
printf("Failed to malloc edgeImage.data\n");
M
exit(0);
}
.CO
printf("%lu bytes malloc'ed for edgeImage.data\n", vectorSize);
originalImage.data = farmalloc(vectorSize*sizeof(unsigned char));
if(originalImage.data == NULL) {
printf("Failed to malloc originalImage.data\n");
OKS
exit(0);
}
printf("%lu bytes malloc'ed for originalImage.datt\n", vectorSize);
/*------COPY HEADER AND COLOR TABLE---------*/
OBO
copyImageInfo(bmpInput, bmpOutput);
copyColorTable(bmpInput, bmpOutput, nColors);
fseek(bmpInput, (14+40+4*nColors), SEEK_SET);
fseek(bmpOutput, (14+40+4*nColors), SEEK_SET);
/* Read input.bmp and store it's raster data into originalImage.data */
KIL
for(row=0; row<=originalImage.rows-1; row++) {
for(col=0; col<=originalImage.cols-1; col++) {
fread(pChar, sizeof(char), 1, bmpInput);
*(originalImage.data + row*originalImage.cols + col) = *pChar;
}
}
http://kilobooks.com
THÖ VIEÄN ÑIEÄN TÖÛ TRÖÏC TUYEÁN
/*--------------------------------------------------SOBEL ALGORITHM STARTS HERE
for(Y=0; Y<=(originalImage.rows-1); Y++) {
M
---------------------------------------------------*/
for(X=0; X<=(originalImage.cols-1); X++) {
.CO
sumX = 0;
sumY = 0;
/* image boundaries */
if(Y==0 || Y==originalImage.rows-1)
OKS
SUM = 0;
else if(X==0 || X==originalImage.cols-1)
SUM = 0;
else {
OBO
/* Convolution starts here */
/*-------X GRADIENT APPROXIMATION------*/
for(I=-1; I<=1; I++) {
for(J=-1; J<=1; J++) {
sumX = sumX + (int)( (*(originalImage.data + X + I + (Y +
}
}
KIL
J)*originalImage.cols)) * GX[I+1][J+1]);
if(sumX>255) sumX=255;
if(sumX<0) sumX=0;
/*-------Y GRADIENT APPROXIMATION-------*/