Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 263

Ấn bản này của Xử lý Hình ảnh Kỹ thuật số Sử dụng MATLAB là một bản sửa đổi

lớn của cuốn sách. Như trong lần xuất bản trước, trọng tâm của cuốn sách dựa trên
thực tế là các giải pháp cho các vấn đề trong lĩnh vực xử lý hình ảnh kỹ thuật số
nói chung đòi hỏi công việc thử nghiệm rộng rãi liên quan đến mô phỏng và thử
nghiệm phần mềm với một bộ ảnh mẫu lớn. Mặc dù việc phát triển thuật toán
thường dựa trên nền tảng lý thuyết, việc triển khai thực tế các thuật toán này hầu
như luôn yêu cầu ước lượng tham số và thường xuyên, sửa đổi thuật toán và so
sánh các giải pháp ứng viên. Do đó, việc lựa chọn một môi trường phát triển phần
mềm linh hoạt, toàn diện và được tài liệu hóa tốt là một yếu tố then chốt có ý nghĩa
quan trọng đối với chi phí, thời gian phát triển và tính khả chuyển của các giải
pháp xử lý hình ảnh.
Bất chấp tầm quan trọng của nó, đáng ngạc nhiên là rất ít được viết về khía cạnh
này của lĩnh vực này dưới dạng tài liệu sách giáo khoa đề cập đến cả các nguyên
tắc lý thuyết và phần mềm thực hiện các khái niệm xử lý ảnh kỹ thuật số. Ấn bản
đầu tiên của cuốn sách này được viết vào năm 2004 để đáp ứng nhu cầu này. Phiên
bản mới này của cuốn sách tiếp tục trọng tâm tương tự. Mục tiêu chính của nó là
cung cấp nền tảng để triển khai các thuật toán xử lý ảnh bằng các công cụ phần
mềm hiện đại. Một mục tiêu bổ sung là cuốn sách có thể đọc được và dễ đọc bởi
những cá nhân có nền tảng cơ bản về xử lý hình ảnh kỹ thuật số, phân tích toán học
và lập trình máy tính, tất cả đều ở cấp độ điển hình được tìm thấy trong chương
trình học cơ sở / cao cấp về chuyên ngành kỹ thuật . Kiến thức thô sơ về MATLAB
cũng là mong muốn.
Để đạt được những mục tiêu này, chúng tôi cảm thấy rằng cần có hai thành phần
chính. Đầu tiên là chọn tài liệu xử lý hình ảnh đại diện cho tài liệu được đề cập
trong một khóa học chính thức về lĩnh vực này. Thứ hai là chọn các công cụ phần
mềm được hỗ trợ tốt và được lập thành tài liệu, và có nhiều ứng dụng trong thế
giới "thực".
Để đáp ứng mục tiêu đầu tiên, hầu hết các khái niệm lý thuyết trong các chương
tiếp theo đã được chọn lọc từ Xử lý hình ảnh kỹ thuật số của Gonzalez và Woods,
là sách giáo khoa nhập môn được các nhà giáo dục trên toàn thế giới sử dụng trong
hơn ba thập kỷ. Các công cụ phần mềm được chọn là từ MATLAB® Image
processing toolbox , tương tự như vậy chiếm vị trí nổi bật trong cả ứng dụng giáo
dục và công nghiệp. Một chiến lược cơ bản được thực hiện trong quá trình chuẩn
bị phiên bản hiện tại là tiếp tục cung cấp tích hợp liền mạch các khái niệm lý
thuyết được thiết lập tốt và việc thực hiện chúng bằng cách sử dụng các công cụ
phần mềm hiện đại.
Cuốn sách được sắp xếp theo cùng dòng với Xử lý ảnh kỹ thuật số. Bằng cách này,
người đọc có thể dễ dàng truy cập vào cách xử lý chi tiết hơn về tất cả các khái
niệm xử lý hình ảnh được thảo luận ở đây, cũng như một bộ tài liệu tham khảo cập
nhật để đọc thêm. Theo cách tiếp cận này, có thể trình bày tài liệu lý thuyết một
cách ngắn gọn và do đó chúng tôi có thể duy trì sự tập trung vào các khía cạnh
triển khai phần mềm của các giải pháp vấn đề xử lý ảnh. Bởi vì nó hoạt động trong
môi trường máy tính MATLAB, Hộp công cụ xử lý hình ảnh cung cấp một số lợi
thế đáng kể, không chỉ về phạm vi rộng của các công cụ tính toán của nó, mà còn
vì nó được hỗ trợ trong hầu hết các hệ điều hành đang được sử dụng ngày nay. Một
tính năng độc đáo của cuốn sách này là nó nhấn mạnh vào việc chỉ ra cách phát
triển mã mới để nâng cao chức năng MATLAB và hộp công cụ hiện có. Đây là
một tính năng quan trọng trong một lĩnh vực như xử lý hình ảnh, như đã nói trước
đó, được đặc trưng bởi nhu cầu phát triển thuật toán rộng rãi và công việc thử
nghiệm.
Sau phần giới thiệu về các nguyên tắc cơ bản của các hàm và lập trình MATLAB,
cuốn sách tiếp tục đề cập đến các lĩnh vực chính của xử lý ảnh. Các lĩnh vực chính
bao gồm biến đổi cường độ, xử lý ảnh mờ, lọc không gian tuyến tính và phi tuyến,
lọc miền tần số, phục hồi và tái tạo hình ảnh, biến đổi hình học và đăng ký ảnh, xử
lý ảnh màu, wavelet, nén dữ liệu ảnh, xử lý ảnh hình thái, phân đoạn ảnh , biểu
diễn và mô tả vùng và ranh giới, và nhận dạng đối tượng. Tài liệu này được bổ
sung bởi nhiều hình ảnh minh họa về cách giải quyết các vấn đề xử lý ảnh bằng
cách sử dụng MATLAB và các hàm hộp công cụ. Trong trường hợp một chức
năng không tồn tại, một chức năng mới đã được viết và ghi lại như một phần của
trọng tâm giảng dạy của cuốn sách. Hơn 120 chức năng mới được bao gồm trong
các chương sau. Các chức năng này làm tăng phạm vi của Hộp công cụ xử lý ảnh
lên khoảng 40% và cũng phục vụ mục đích quan trọng là minh họa thêm cách triển
khai các giải pháp phần mềm xử lý ảnh mới.
Tài liệu được trình bày dưới dạng sách giáo khoa, không phải là sách hướng dẫn sử
dụng phần mềm. Mặc dù cuốn sách là riêng lẻ, chúng tôi đã thiết lập một trang web
đồng hành (xem Phần 1.5) được thiết kế để cung cấp hỗ trợ trong một số lĩnh vực.
Đối với sinh viên theo một khóa học chính thức hoặc các cá nhân bắt tay vào
chương trình tự học, trang web có các hướng dẫn và đánh giá về tài liệu nền, cũng
như các dự án và cơ sở dữ liệu hình ảnh, bao gồm tất cả các hình ảnh trong sách.
Đối với người hướng dẫn, trang này chứa các tài liệu thuyết trình trong lớp học bao
gồm các slide PowerPoint của tất cả các hình ảnh và đồ họa được sử dụng trong
sách. Những cá nhân đã quen thuộc với các nguyên tắc cơ bản về xử lý hình ảnh và
hộp công cụ sẽ thấy trang web là một nơi hữu ích cho các tài liệu tham khảo cập
nhật, các kỹ thuật triển khai mới và một loạt các tài liệu hỗ trợ khác không dễ tìm
thấy ở nơi khác. Tất cả những người mua sách mới đều đủ điều kiện tải xuống các
tệp thực thi của tất cả các chức năng mới được phát triển trong văn bản miễn phí.
Như đúng với hầu hết các nỗ lực viết về bản chất này, tiến độ vẫn tiếp tục sau khi
công việc trên bản thảo dừng lại. Vì lý do này, chúng tôi đã dành nỗ lực đáng kể
cho việc lựa chọn tài liệu mà chúng tôi tin là cơ bản và giá trị của chúng có khả
năng vẫn áp dụng trong một khối kiến thức đang phát triển nhanh chóng. Chúng tôi
tin tưởng rằng độc giả của cuốn sách sẽ được hưởng lợi từ nỗ lực này và do đó tìm
thấy tài liệu kịp thời và hữu ích trong công việc của họ.
Preview
Xử lý hình ảnh kỹ thuật số là một lĩnh vực được đặc trưng bởi sự cần thiết của
công việc thử nghiệm rộng rãi để thiết lập khả năng tồn tại của các giải pháp đề
xuất cho một vấn đề nhất định. Trong chương này, chúng tôi phác thảo cách tích
hợp nền tảng lý thuyết và phần mềm hiện đại vào môi trường tạo mẫu với mục tiêu
là cung cấp một bộ công cụ được hỗ trợ tốt để giải quyết một loạt các vấn đề trong
xử lý ảnh kỹ thuật số.
1.1Tổng quan
Một đặc điểm quan trọng cơ bản của thiết kế hệ thống xử lý hình ảnh là mức độ
kiểm tra và thử nghiệm đáng kể thường được yêu cầu trước khi đi đến một giải
pháp chấp nhận được. Đặc điểm này ngụ ý rằng khả năng hình thành các phương
pháp tiếp cận và nhanh chóng các giải pháp ứng viên nguyên mẫu thường đóng
một vai trò quan trọng trong việc giảm chi phí và thời gian cần thiết để đạt được
một triển khai hệ thống khả thi.
Rất ít tài liệu được viết theo kiểu tài liệu hướng dẫn để thu hẹp khoảng cách giữa lý
thuyết và ứng dụng trong một môi trường phần mềm được hỗ trợ tốt để xử lý hình
ảnh. Mục tiêu chính của cuốn sách này là tích hợp một nền tảng rộng lớn của các
khái niệm lý thuyết với kiến thức cần thiết để triển khai các khái niệm đó bằng
cách sử dụng các công cụ phần mềm xử lý hình ảnh hiện đại. Cơ sở lý thuyết của
tài liệu trong các chương sau dựa trên sách giáo khoa hàng đầu trong lĩnh vực: Xử
lý ảnh kỹ thuật số, của Gonzalez và Woods.t Mã phần mềm và các công cụ hỗ trợ
dựa trên phần mềm hàng đầu trong lĩnh vực này: MATLAB® và Hộp công cụ xử
lý hình ảnh "'của The Math Works, Inc. (xem Phần 1.3). Tài liệu trong sách có
cùng thiết kế, ký hiệu và kiểu trình bày với văn bản Gonzalez-Woods, do đó đơn
giản hóa việc tham chiếu chéo giữa hai tài liệu này.
Cuốn sách là khép kín. Để nắm vững nội dung của nó, người đọc nên có sự chuẩn
bị nhập môn về xử lý ảnh kỹ thuật số, bằng cách tham gia một khóa học chính thức
về chủ đề này ở cấp cao học năm thứ nhất hoặc năm thứ nhất, hoặc bằng cách có
được nền tảng cần thiết trong một chương trình của bản thân học. Người ta cũng
nên sử dụng MATLAB và có kiến thức thô sơ về lập trình máy tính. Vì MATLAB
là ngôn ngữ hướng ma trận nên kiến thức cơ bản về phân tích ma trận là hữu ích.
Cuốn sách dựa trên các nguyên tắc. Nó được sắp xếp và trình bày dưới dạng sách
giáo khoa, không phải như sách hướng dẫn. Do đó, các ý tưởng cơ bản của cả lý
thuyết và phần mềm đều được giải thích trước khi phát triển bất kỳ khái niệm lập
trình mới nào. Tài liệu được minh họa và làm rõ thêm bằng nhiều ví dụ khác nhau,
từ y học và kiểm tra công nghiệp đến viễn thám và thiên văn học. Cách tiếp cận
này cho phép tiến trình có trật tự từ các khái niệm đơn giản đến việc thực hiện các
thuật toán xử lý ảnh một cách phức tạp. Tuy nhiên, độc giả đã quen thuộc với
MATLAB, Hộp công cụ xử lý hình ảnh và các nguyên tắc cơ bản về xử lý hình ảnh
có thể tiến hành trực tiếp đến các ứng dụng cụ thể mà bạn quan tâm, trong trường
hợp đó, các chức năng trong sách có thể được sử dụng như một phần mở rộng của
họ chức năng hộp công cụ. Tất cả các chức năng mới được phát triển trong cuốn
sách đều được ghi lại đầy đủ và mã cho mỗi chức năng được bao gồm trong một
chương hoặc trong Phụ lục C.
Hơn 120 chức năng tùy chỉnh được phát triển trong các chương tiếp theo. Các chức
năng này mở rộng gần 45% so với khoảng 270 chức năng trong Hộp công cụ xử lý
hình ảnh. Ngoài việc giải quyết các ứng dụng cụ thể, các chức năng mới là ví dụ
điển hình về cách kết hợp MATLAB và các chức năng hộp công cụ hiện có với mã
mới để phát triển các giải pháp nguyên mẫu cho nhiều vấn đề trong xử lý hình ảnh
kỹ thuật số. Các chức năng của hộp công cụ, cũng như các chức năng được phát
triển trong cuốn sách, chạy trong hầu hết các hệ điều hành. Tham khảo trang web
sách (xem Phần 1.5) để có danh sách đầy đủ.
1.2What Is Digital Image Processing?
Một hình ảnh có thể được định nghĩa là một hàm hai chiều, f (x, y). trong đó x và y
là các tọa độ không gian, và biên độ tắt ở bất kỳ cặp tọa độ nào (x, y) được gọi là
cường độ hoặc mức xám của ảnh tại điểm đó. Khi x, y và các giá trị biên độ của f
đều là các đại lượng hữu hạn, rời rạc, ta gọi ảnh là ảnh số. Lĩnh vực xử lý hình ảnh
kỹ thuật số đề cập đến việc xử lý hình ảnh kỹ thuật số bằng máy tính kỹ thuật số.
Lưu ý rằng hình ảnh kỹ thuật số bao gồm một số lượng hữu hạn các phần tử, mỗi
phần tử có một vị trí và giá trị cụ thể. Những yếu tố này được gọi là yếu tố hình
ảnh, yếu tố hình ảnh, pels và pixel. Pixel là thuật ngữ được sử dụng rộng rãi nhất
để biểu thị các yếu tố của hình ảnh kỹ thuật số. Chúng tôi xem xét các định nghĩa
này chính thức trong Chương 2.
Thị giác là giác quan tiên tiến nhất của chúng ta, vì vậy không có gì ngạc nhiên khi
hình ảnh đóng một vai trò quan trọng nhất trong nhận thức của con người. Tuy
nhiên, không giống như con người, những người bị giới hạn trong dải hình ảnh của
phổ điện từ (EM), máy ảnh bao phủ gần như toàn bộ phổ EM, từ gamma đến sóng
vô tuyến. Chúng cũng có thể hoạt động trên các hình ảnh được tạo ra bởi các
nguồn mà con người thường không liên kết với hình ảnh. Chúng bao gồm siêu âm,
kính hiển vi điện tử và hình ảnh do máy tính tạo ra. Do đó, xử lý hình ảnh kỹ thuật
số bao gồm một lĩnh vực ứng dụng rộng rãi và đa dạng.

Không có thỏa thuận chung giữa các tác giả về nơi bắt đầu xử lý hình ảnh và các
lĩnh vực liên quan khác, chẳng hạn như phân tích hình ảnh và thị giác máy tính.
Đôi khi, sự khác biệt được thực hiện bằng cách xác định xử lý hình ảnh như một
kỷ luật trong đó cả đầu vào và đầu ra của một quy trình đều là hình ảnh. Chúng tôi
tin rằng đây là một ranh giới giới hạn và có phần nhân tạo. Ví dụ, theo định nghĩa
này, ngay cả nhiệm vụ nhỏ là tính toán cường độ trung bình của một hình ảnh cũng
sẽ không được coi là một hoạt động xử lý hình ảnh. Mặt khác, có những lĩnh vực,
chẳng hạn như thị giác máy tính, mục tiêu cuối cùng là sử dụng máy tính để mô
phỏng thị giác của con người, bao gồm học tập và có thể đưa ra suy luận và thực
hiện hành động dựa trên đầu vào trực quan. Bản thân khu vực này là một nhánh
của trí tuệ nhân tạo (AI), với mục tiêu là mô phỏng trí thông minh của con người.
Lĩnh vực AI đang trong giai đoạn sơ khai về mặt phát triển thực tế, với tiến độ
chậm hơn nhiều so với dự đoán ban đầu. Lĩnh vực phân tích hình ảnh (còn gọi là
hiểu hình ảnh) nằm giữa xử lý hình ảnh và thị giác máy tính.
Không có ranh giới rõ ràng trong quá trình liên tục từ xử lý hình ảnh ở đầu này đến
tầm nhìn máy tính ở đầu kia. Tuy nhiên, một mô hình hữu ích là xem xét ba loại
quy trình được máy tính hóa trong liên tục này: quy trình cấp thấp, trung bình và
cấp cao. Các quy trình cấp thấp liên quan đến các hoạt động nguyên thủy, chẳng
hạn như tiền xử lý hình ảnh để giảm nhiễu, tăng cường độ tương phản và làm sắc
nét hình ảnh. Quy trình cấp thấp được đặc trưng bởi thực tế là cả đầu vào và đầu ra
của nó thường là hình ảnh. Các quy trình cấp trung trên hình ảnh liên quan đến các
nhiệm vụ như phân đoạn (phân vùng hình ảnh thành các vùng hoặc đối tượng), mô
tả các đối tượng đó để giảm chúng thành dạng phù hợp với xử lý máy tính và phân
loại (nhận dạng) các đối tượng riêng lẻ. Quá trình cấp trung bình được đặc trưng
bởi thực tế là đầu vào của nó thường là hình ảnh, nhưng đầu ra của nó là các thuộc
tính được trích xuất từ những hình ảnh đó (ví dụ: các cạnh, đường viền và danh
tính của các đối tượng riêng lẻ). Cuối cùng, xử lý cấp cao liên quan đến việc "hiểu"
một nhóm các đối tượng được công nhận, như trong phân tích hình ảnh, và ở đầu
xa của liên tục, thực hiện các chức năng nhận thức thường liên quan đến thị giác
của con người.
Dựa trên các nhận xét ở trên, chúng ta thấy rằng vị trí chồng chéo hợp lý giữa xử lý
ảnh và phân tích ảnh là vùng nhận biết các vùng hoặc đối tượng riêng lẻ trong ảnh.
Vì vậy, những gì chúng tôi gọi trong cuốn sách này là xử lý hình ảnh kỹ thuật số
bao gồm các quy trình có đầu vào và đầu ra là hình ảnh và ngoài ra. bao gồm các
quy trình trích xuất các thuộc tính từ hình ảnh, lên đến và bao gồm cả việc nhận
dạng các đối tượng riêng lẻ. Như một minh họa đơn giản để làm rõ những khái
niệm này, hãy xem xét lĩnh vực phân tích văn bản tự động. Các các quy trình thu
nhận hình ảnh của vùng chứa văn bản, xử lý trước hình ảnh đó, trích xuất (phân
đoạn) các ký tự riêng lẻ, mô tả các ký tự ở dạng phù hợp với xử lý máy tính và
nhận dạng các ký tự riêng lẻ đó, nằm trong phạm vi mà chúng tôi gọi là kỹ thuật số
xử lý hình ảnh trong cuốn sách này. Việc hiểu rõ nội dung của trang có thể được
xem như nằm trong lĩnh vực phân tích hình ảnh và thậm chí cả thị giác máy tính,
tùy thuộc vào mức độ phức tạp được ngụ ý bởi câu nói "có ý nghĩa". Xử lý hình
ảnh kỹ thuật số, như chúng tôi đã định nghĩa, được sử dụng thành công trong một
loạt các lĩnh vực có giá trị kinh tế và xã hội đặc biệt.
1.3Background on MATLAB and the Image Processing Toolbox
MATLAB là một ngôn ngữ hiệu suất cao cho tính toán kỹ thuật. Nó tích hợp tính
toán, trực quan và lập trình trong một môi trường dễ sử dụng, nơi các vấn đề và
giải pháp được thể hiện bằng ký hiệu toán học quen thuộc. Những cách sử dụng
điển hình bao gồm:
 Toán học và tính toán
 Phát triển thuật toán
 Thu thập dữ liệu
 Mô hình hóa, mô phỏng và tạo mẫu
 Phân tích dữ liệu, thăm dò và trực quan hóa
 Đồ họa khoa học và kỹ thuật
 Phát triển ứng dụng, bao gồm xây dựng giao diện người dùng đồ họa
MATLAB là một hệ thống tương tác có phần tử dữ liệu cơ bản là một ma trận.
Điều này cho phép xây dựng các giải pháp cho nhiều vấn đề tính toán kỹ thuật, đặc
biệt là những vấn đề liên quan đến biểu diễn ma trận, trong một phần nhỏ thời gian
cần thiết để viết một chương trình bằng ngôn ngữ không tương tác vô hướng như
C.
Tên MATLAB là viết tắt của Phòng thí nghiệm Ma trận. Ban đầu MATLAB được
viết để cung cấp khả năng truy cập dễ dàng vào phần mềm đại số tuyến tính và ma
trận mà trước đây yêu cầu viết chương trình FORTRAN để sử dụng. Ngày nay,
MATLAB kết hợp phần mềm tính toán số hiện đại được tối ưu hóa cao cho các bộ
xử lý và kiến trúc bộ nhớ hiện đại.
Trong môi trường đại học, MATLAB là công cụ tính toán tiêu chuẩn cho các khóa
học nhập môn và nâng cao về toán học, kỹ thuật và khoa học. Trong ngành,
MATLAB là công cụ tính toán được lựa chọn để nghiên cứu, phát triển và phân
tích. MATLAB được bổ sung bởi một nhóm các giải pháp dành riêng cho ứng
dụng được gọi là hộp công cụ. Hộp công cụ xử lý hình ảnh là một tập hợp các hàm
MATLAB (được gọi là M-function hoặc M-files) mở rộng khả năng của môi
trường MATLAB đối với giải pháp của các vấn đề xử lý ảnh kỹ thuật số. Các hộp
công cụ khác đôi khi được sử dụng để bổ sung cho Hộp công cụ Xử lý Hình ảnh là
Hộp công cụ Xử lý Tín hiệu, Mạng Neural, Logic mờ và Wavelet.
Phiên bản MATLAB & Simulink Student là một sản phẩm bao gồm phiên bản đầy
đủ tính năng của MATLAB, Hộp công cụ xử lý hình ảnh và một số hộp công cụ
hữu ích khác. Phiên bản dành cho Sinh viên có thể được mua với mức chiết khấu
đáng kể tại các hiệu sách của trường đại học và tại trang web MathWorks
(www.mathworks.com).
1.4Các lĩnh vực xử lý hình ảnh được đề cập trong sách
Mỗi chương trong cuốn sách đều chứa tài liệu MATLAB và Hộp công cụ xử lý
hình ảnh thích hợp cần thiết để triển khai các phương pháp xử lý hình ảnh đã thảo
luận. Chà! MATLAB hoặc chức năng hộp công cụ không tồn tại để triển khai một
phương pháp cụ thể, một chức năng tùy chỉnh được phát triển và ghi lại. Như đã
lưu ý trước đó, một danh sách đầy đủ của mọi chức năng mới đều có sẵn. Mười hai
chương còn lại bao gồm tài liệu trong các lĩnh vực sau.
Chương 2: Nguyên tắc cơ bản. Chương này bao gồm các nguyên tắc cơ bản về ký
hiệu MATLAB, lập chỉ mục ma trận và các khái niệm lập trình. Tài liệu này làm
nền tảng cho phần còn lại của cuốn sách.
Chương 3: Biến đổi cường độ và lọc không gian. Chương này trình bày chi tiết
cách sử dụng MATLAB và Hộp công cụ xử lý ảnh để thực hiện các chức năng biến
đổi cường độ. Các bộ lọc không gian tuyến tính và phi tuyến được bao phủ và
minh họa chi tiết. Chúng tôi cũng phát triển một tập hợp các hàm cơ bản cho phép
biến đổi cường độ mờ và lọc không gian.
Chương 4: Xử lý trong miền tần số. Tài liệu trong chương này trình bày cách sử
dụng các hàm hộp công cụ để tính toán các phép biến đổi Fourier nhanh 2 chiều
thuận và nghịch (FFTs), cách trực quan hóa phổ Fourier và cách thực hiện lọc
trong miền tần số. Hiển thị cũng là một phương pháp để tạo bộ lọc miền tần số từ
các bộ lọc không gian được chỉ định.
Chương 5: Khôi phục hình ảnh. Các phương pháp khôi phục tuyến tính truyền
thống, chẳng hạn như bộ lọc Wiener, được đề cập trong chương này. Các phương
pháp lặp lại, phi tuyến tính, chẳng hạn như phương pháp Richardson-Lucy và ước
lượng khả năng xảy ra tối đa cho quá trình giải mã mù, được thảo luận và minh
họa. Sự tái tạo hình ảnh từ các phép chiếu và cách nó được sử dụng trong chụp cắt
lớp vi tính cũng được thảo luận trong chương này.
Chương 6: Biến đổi hình học và đăng ký ảnh. Chương này thảo luận về các dạng
cơ bản và kỹ thuật thực hiện cho các phép biến đổi ảnh hình học, chẳng hạn như
các phép biến đổi affine và xạ ảnh. Phương pháp nội suy cũng được trình bày. Các
kỹ thuật đăng ký hình ảnh khác nhau được thảo luận và một số ví dụ về các
phương pháp chuyển đổi, đăng ký và hình ảnh hóa được đưa ra.
Chương 7: Xử lý ảnh màu. Chương này đề cập đến xử lý ảnh giả và màu đầy đủ.
Các mô hình màu áp dụng cho xử lý hình ảnh kỹ thuật số được thảo luận và chức
năng Hộp công cụ xử lý hình ảnh trong xử lý màu được mở rộng với các mô hình
màu bổ sung. Chương này cũng bao gồm các ứng dụng của màu sắc để phát hiện
cạnh và phân đoạn vùng.
Chương 8: Wavelets. Hộp Công cụ Xử lý Hình ảnh không có các chức năng biến
đổi wavelet. Mặc dù Math Works cung cấp Hộp công cụ Wavelet, chúng tôi phát
triển trong chương này một tập hợp các hàm biến đổi wavelet độc lập cho phép
thực hiện tất cả các khái niệm biến đổi wavelet được thảo luận trong Chương 7 của
Xử lý ảnh kỹ thuật số của Gonzalez và Woods.
Chương 9: Nén ảnh. Hộp công cụ không có bất kỳ chức năng nén dữ liệu nào.
Trong chương này, chúng tôi phát triển một tập hợp các hàm có thể được sử dụng
cho mục đích này.
Chương 10: Xử lý ảnh hình thái. Phổ rộng của các chức năng có sẵn trong hộp
công cụ để xử lý ảnh hình thái học được giải thích và minh họa trong chương này
bằng cách sử dụng cả ảnh nhị phân và ảnh thang xám.
Chương 11: Phân đoạn ảnh. Tập hợp các chức năng hộp công cụ có sẵn để phân
đoạn hình ảnh được giải thích và minh họa trong chương này. Các chức năng cho
quá trình xử lý biến đổi Hough được thảo luận và các chức năng định ngưỡng và
phát triển vùng tùy chỉnh được phát triển.
Chương 12: Trình bày và Mô tả. Một số chức năng mới cho biểu diễn và mô tả đối
tượng, bao gồm các biểu diễn mã chuỗi và đa giác, được phát triển trong chương
này. Các chức năng mới cũng được bao gồm cho mô tả đối tượng, bao gồm các bộ
mô tả Fourier, kết cấu và các bất biến thời điểm. Các chức năng này bổ sung cho
một tập hợp phong phú các chức năng thuộc tính vùng có sẵn trong Hộp công cụ
xử lý hình ảnh.
Chương 13: Nhận dạng đối tượng. Một trong những tính năng quan trọng của
chương này là việc triển khai hiệu quả các hàm để tính toán khoảng cách Euclidean
và Mahalanobis. Các chức năng này đóng vai trò trung tâm trong việc khớp mẫu.
Chương này cũng bao gồm một cuộc thảo luận toàn diện về cách thao tác các chuỗi
ký hiệu trong MATLAB. Thao tác và đối sánh chuỗi rất quan trọng trong việc nhận
dạng mẫu cấu trúc.
Ngoài các tài liệu trước, cuốn sách có ba phụ lục.
Phụ lục A: Phụ lục này tóm tắt Hộp công cụ xử lý ảnh và các chức năng xử lý ảnh
tùy chỉnh được phát triển trong cuốn sách. Các chức năng MATLAB có liên quan
cũng được bao gồm. Đây là tài liệu tham khảo hữu ích cung cấp cái nhìn tổng thể
về tất cả các chức năng trong hộp công cụ và cuốn sách.
Phụ lục B: Việc triển khai các giao diện người dùng đồ họa (GUis) trong
MATLAB được thảo luận trong phụ lục này. GUis bổ sung cho tài liệu trong cuốn
sách vì chúng đơn giản hóa và trực quan hơn việc điều khiển các chức năng tương
tác.
Phụ lục C: Mã cho nhiều chức năng tùy chỉnh được bao gồm trong phần nội dung
của văn bản tại thời điểm các chức năng được phát triển. Một số danh sách chức
năng được đưa vào phụ lục này khi việc đưa chúng vào văn bản chính sẽ phá vỡ
luồng giải thích.
1.5The Book Web Site
1.6Ký hiệu
Các phương trình trong sách được sắp chữ sử dụng các ký hiệu in nghiêng và Hy
Lạp quen thuộc, như
f(x, y) =A sin(ux + vy) và Φ (u, v) = tan-1 [ l(u, v)/ R(u, v) ] Tất cả các ký hiệu và
tên hàm MATLAB đều được sắp chữ bằng phông chữ monospace, như trong fft2
( f), logical (A) , and roipoly (f, c, r).
Khi đề cập đến các phím trên bàn phím, chúng tôi sử dụng các chữ cái in đậm,
chẳng hạn như Return và Tab. Chúng tôi cũng sử dụng các chữ cái in đậm khi đề
cập đến các mục trên màn hình máy tính hoặc menu, chẳng hạn như Tệp và Chỉnh
sửa.
1.7The MATLAB Desktop
1.7.1 Using the MATLAB Editor/Debugger
1.7.2 Getting Help
1.7.3 Saving ahd Retrieving Work Session Data
1.8Cách tổ chức tài liệu tham khảo trong sách
Tất cả các tài liệu tham khảo trong cuốn sách được liệt kê trong Thư mục theo tác
giả và ngày tháng, như trong Soille [2003]. Hầu hết các tài liệu tham khảo nền tảng
cho nội dung lý thuyết của cuốn sách là của Gonzalez và Woods [2008]. Trong
trường hợp điều này không đúng, các tham chiếu mới thích hợp được xác định tại
điểm trong cuộc thảo luận nơi chúng cần thiết. Các tài liệu tham khảo có thể áp
dụng cho tất cả các chương, chẳng hạn như sổ tay hướng dẫn MATLAB và các tài
liệu tham khảo MATLAB chung khác, được xác định như vậy trong Thư mục.
Tổng kết
Ngoài phần giới thiệu ngắn gọn về ký hiệu và các công cụ MATLAB cơ bản, tài
liệu trong chương này nhấn mạnh tầm quan trọng của môi trường tạo mẫu toàn
diện trong giải pháp các vấn đề xử lý ảnh kỹ thuật số. Trong chương sau, chúng ta
bắt đầu để đặt nền tảng cần thiết để hiểu các chức năng của Hộp công cụ xử lý hình
ảnh và giới thiệu một tập hợp các khái niệm lập trình cơ bản được sử dụng xuyên
suốt cuốn sách. Tài liệu trong các Chương từ 3 đến 13 trải dài qua nhiều chủ đề
nằm trong xu hướng chính của các ứng dụng xử lý ảnh kỹ thuật số. Tuy nhiên, mặc
dù các chủ đề được đề cập rất đa dạng, cuộc thảo luận trong các chương đó theo
cùng một chủ đề cơ bản là chứng minh cách kết hợp các chức năng MATLAB và
hộp công cụ với mã mới có thể được sử dụng để giải quyết một loạt các vấn đề xử
lý hình ảnh.
Chương 2:
Tổng quan
Như đã đề cập trong chương trước, sức mạnh mà MATLAB mang lại cho xử lý
ảnh kỹ thuật số là một tập hợp các hàm mở rộng để xử lý các mảng đa chiều trong
đó ảnh (mảng số hai chiều) là một trường hợp đặc biệt. Hộp Công cụ Xử lý Hình
ảnh là một tập hợp các chức năng mở rộng khả năng của môi trường máy tính số
MATLAB. Các chức năng này và tính biểu đạt của ngôn ngữ MATLAB giúp các
thao tác xử lý hình ảnh dễ dàng được viết một cách gọn nhẹ, rõ ràng, do đó cung
cấp một môi trường tạo mẫu phần mềm lý tưởng cho giải pháp các vấn đề xử lý
hình ảnh. Trong chương này, chúng tôi giới thiệu các khái niệm cơ bản về ký hiệu
MATLAB, thảo luận một số thuộc tính và chức năng cơ bản của hộp công cụ và
bắt đầu thảo luận về các khái niệm lập trình. Do đó, tài liệu trong chương này là
nền tảng cho hầu hết các cuộc thảo luận liên quan đến phần mềm trong phần còn
lại của cuốn sách.
2.1 Biểu diễn hình ảnh kỹ thuật số
Kết quả của việc lấy mẫu và lượng tử hóa là một ma trận các số thực. Chúng tôi sử
dụng hai cách chính trong cuốn sách này để biểu diễn hình ảnh kỹ thuật số. Giả sử
rằng một ảnh f (x, y) được lấy mẫu để ảnh thu được có M hàng và N cột. Ta nói
rằng ảnh có kích thước M X N. Các giá trị của tọa độ là các đại lượng rời rạc. Để
thuận tiện và rõ ràng về mặt ký hiệu, chúng tôi sử dụng các giá trị nguyên cho các
tọa độ rời rạc này. Trong nhiều sách xử lý hình ảnh, nguồn gốc hình ảnh được xác
định là tại (x, y) = (0, 0). Các giá trị tọa độ tiếp theo dọc theo hàng đầu tiên của
hình ảnh là (x, y) = (0, 1). Kí hiệu (0, 1) được sử dụng để biểu thị mẫu thứ hai dọc
theo hàng đầu tiên. Nó không có nghĩa là đây là các giá trị thực của tọa độ vật lý
khi hình ảnh được lấy mẫu. Hình 2. 1 (a) cho thấy quy ước tọa độ này. Lưu ý rằng
x nằm trong khoảng từ 0 đến M - 1 và y từ 0 đến N - 1 theo số nguyên.
Quy ước tọa độ được sử dụng trong Hộp công cụ xử lý ảnh để biểu thị các mảng
khác với đoạn trước theo hai cách nhỏ. Đầu tiên, thay vì sử dụng (x, y), hộp công
cụ sử dụng ký hiệu (r, c) để chỉ hàng và cột. Tuy nhiên, lưu ý rằng thứ tự của các
tọa độ giống như thứ tự đã thảo luận trong đoạn trước, theo nghĩa là phần tử đầu
tiên của một bộ tọa độ, (a, b), tham chiếu đến một hàng và phần tử thứ hai đến một
cột. Điểm khác biệt nữa là gốc của hệ tọa độ là (r, c) = (1, 1); do đó, r nằm trong
khoảng từ 1 đến M và c từ 1 đến N, theo số nguyên. Hình 2.1 (b) minh họa quy
ước tọa độ này.

Tài liệu Hộp công cụ xử lý hình ảnh đề cập đến các tọa độ trong Hình 2.l (b) dưới
dạng tọa độ pixel. Ít thường xuyên hơn, hộp công cụ cũng sử dụng một quy ước tọa
độ khác, được gọi là tọa độ không gian, sử dụng x để tham chiếu đến cột và y để
tham chiếu đến hàng. Điều này ngược lại với việc chúng ta sử dụng các biến x và
y. Với một số ngoại lệ, chúng tôi không sử dụng quy ước tọa độ không gian của
hộp công cụ trong cuốn sách này, nhưng nhiều hàm MATLAB thì có, và bạn chắc
chắn sẽ gặp nó trong hộp công cụ và tài liệu MATLAB.
2.1.2 Hình ảnh dưới dạng ma trận
Hệ tọa độ trong Hình 2. 1 (a) và phần thảo luận trước dẫn đến cách biểu diễn sau
đây cho một hình ảnh số hóa:
Vế phải của phương trình này là một hình ảnh kỹ thuật số theo định nghĩa. Mỗi
phần tử của mảng này được gọi là phần tử hình ảnh, phần tử hình ảnh, pixel hoặc
vật nuôi. Thuật ngữ hình ảnh và pixel được sử dụng trong suốt phần còn lại của các
cuộc thảo luận của chúng tôi để biểu thị hình ảnh kỹ thuật số và các yếu tố của nó.
Một hình ảnh kỹ thuật số có thể được biểu diễn dưới dạng ma trận MATLAB:

trong đó F (1, 1) = f (0, 0) (lưu ý sử dụng phông chữ monospace để biểu thị các đại
lượng MATLAB). Rõ ràng, hai đại diện là giống hệt nhau, ngoại trừ sự thay đổi về
nguồn gốc. Kí hiệu f (p, q) biểu thị phần tử nằm ở hàng p và cột q. Ví dụ, f (6, 2) là
phần tử ở hàng thứ sáu và cột thứ hai của ma trận f. Thông thường, chúng ta sử
dụng các chữ cái M và N tương ứng để biểu thị số hàng và số cột trong ma trận.
Ma trận 1 x N được gọi là vectơ hàng, trong khi ma trận M x 1 được gọi là vectơ
cột. Ma trận 1 x 1 là một vô hướng.
Các ma trận trong MATLAB được lưu trữ trong các biến có tên như A, a, RGB,
real_array, v.v. Các biến phải bắt đầu bằng một chữ cái và chỉ chứa các chữ cái,
chữ số và dấu gạch dưới. Như đã lưu ý trong đoạn trước, tất cả các số lượng
MATLAB trong cuốn sách này được viết bằng các ký tự monospace. Chúng tôi sử
dụng ký hiệu in nghiêng La Mã thông thường, chẳng hạn như f (x, y), cho các biểu
thức toán học.
2.2 Reading Images
Hình ảnh được đọc vào môi trường MATLAB bằng hàm imread, có cú pháp cơ
bản là: imread(‘filename’)
Ở đây, tên tệp là một chuỗi chứa tên đầy đủ của tệp hình ảnh (bao gồm bất kỳ phần
mở rộng áp dụng nào). Ví dụ, câu lệnh >> f = imread ( ' chestxray.jpg ' ); đọc ảnh
từ tệp JPEG rương vào mảng ảnh f. Lưu ý việc sử dụng dấu nháy đơn (') để phân
tách tên tệp chuỗi. Dấu chấm phẩy ở cuối câu lệnh được MATLAB sử dụng để
chặn đầu ra. Nếu không có dấu chấm phẩy, MATLAB hiển thị trên màn hình kết
quả của (các) thao tác được chỉ định trong dòng đó. Biểu tượng dấu nhắc (») chỉ
định phần đầu của một dòng lệnh, khi nó xuất hiện trong Cửa sổ lệnh MATLAB
(xem Hình 1.1).
Khi, như trong dòng lệnh trước, không có thông tin đường dẫn nào được bao gồm
trong tên tệp, imread đọc tệp từ Thư mục hiện tại và nếu không thành công, nó sẽ
cố gắng tìm tệp trong đường dẫn tìm kiếm MATLAB (xem Phần 1 .7). Cách đơn
giản nhất để đọc một hình ảnh từ một thư mục được chỉ định là bao gồm một
đường dẫn đầy đủ hoặc tương đối đến thư mục đó trong f ilename. Ví dụ:
>> f = imread ( 'D: \myimages \ chestx ray .jpg' );
đọc hình ảnh từ một thư mục có tên là hình ảnh của tôi trong ổ đĩa D: \, trong khi
>> f = imread (' . \ myimages \ chestxray.jpg ' );
đọc hình ảnh từ thư mục con hình ảnh của tôi của thư mục làm việc hiện tại. Màn
hình nền MATLAB hiển thị đường dẫn đến Thư mục hiện tại trên thanh công cụ,
cung cấp một cách dễ dàng để thay đổi nó. Bảng 2.1 liệt kê một số định dạng hình
ảnh / đồ họa phổ biến nhất được hỗ trợ bởi imread và imwrite (imwrite được thảo
luận trong Phần 2.4).
Kích thước nhập tại dấu nhắc cung cấp kích thước hàng và cột của một hình ảnh:
» size (f)
ans =
1024 1024
Tổng quát hơn, đối với một mảng A có số thứ nguyên tùy ý, một câu lệnh có dạng
[ D1 , D2 , ... , DK] = size (A)
trả về kích thước của K kích thước đầu tiên của A. Hàm này đặc biệt hữu ích trong
lập trình để xác định tự động kích thước của hình ảnh 2-D:
» [M, N] = size(f) ;
Cú pháp này trả về số hàng (M) và cột (N) trong hình ảnh. Tương tự, lệnh
» M = size ( f, 1 ) ;
cung cấp cho kích thước của f dọc theo chiều đầu tiên của nó, được MATLAB xác
định là kích thước dọc. Nghĩa là, lệnh này cho số hàng trong f. Kích thước thứ hai
của một mảng là theo hướng ngang, vì vậy kích thước câu lệnh (f, 2) cho số cột
trong f. Thứ nguyên singleton là thứ nguyên bất kỳ, mờ, với kích thước (A, dim) =
1.
Hàm whos hiển thị thông tin bổ sung về một mảng. Đối với ví dụ, câu lệnh
>> whos f
Cho

Trình duyệt Workspace trong MATLAB Desktop hiển thị thông tin tương tự. Mục
nhập uintB được hiển thị đề cập đến một trong một số lớp dữ liệu MATLAB được
thảo luận trong Phần 2.5. Dấu chấm phẩy ở cuối dòng whos không có tác dụng, vì
vậy thông thường dấu chấm phẩy không được sử dụng.
2.3 Hiện thị hình ảnh
Hình ảnh được hiển thị trên màn hình MATLAB bằng cách sử dụng hàm imshow,
có cú pháp cơ bản:
imshow(f)
trong đó f là một mảng ảnh. Sử dụng cú pháp
imshow(f , [ low high ])
hiển thị màu đen tất cả các giá trị nhỏ hơn hoặc bằng thấp và màu trắng cho tất cả
các giá trị lớn hơn hoặc bằng high. Các giá trị ở giữa được hiển thị dưới dạng giá
trị cường độ trung gian. Cuối cùng, cú pháp
imshow(f , [ ] )
đặt biến thấp thành giá trị nhỏ nhất của mảng f và cao thành giá trị lớn nhất của nó.
Hình thức imshow này hữu ích để hiển thị hình ảnh có dải động thấp hoặc có giá trị
âm và dương.
Các câu lệnh sau đây đọc từ đĩa một hình ảnh được gọi là rose_51 2. tif, trích xuất
thông tin về hình ảnh và hiển thị nó bằng imshow:

A semicolon at the end of an imshow line has no effect, so normally one is not
used. Figure 2.2 shows what the output looks like on the screen. Con số xuất hiện ở
trên cùng, bên trái của cửa sổ. Lưu ý các menu kéo xuống khác nhau và các nút
tiện ích. Chúng được sử dụng cho các quy trình như chia tỷ lệ, lưu và xuất nội
dung của cửa sổ hiển thị. Đặc biệt, menu Edit có các chức năng chỉnh sửa và định
dạng nội dung trước khi in hoặc lưu vào đĩa

Nếu một hình ảnh khác, g, được hiển thị bằng imshow, MATLAB sẽ thay thế hình
ảnh trong cửa sổ hình bằng hình ảnh mới. Để giữ hình ảnh đầu tiên và xuất ra hình
ảnh thứ hai, hãy sử dụng hình hàm như sau:
>> figure , imshow(g)
Sử dụng câu lệnh
>> imshow(f) , figure , imshow(g)
Hình 2.3 (b) cho thấy kết quả. Sự cải thiện rõ rang
Công cụ Hình ảnh trong Hộp công cụ Xử lý Hình ảnh cung cấp một môi trường
tương tác hơn để xem và điều hướng trong hình ảnh, hiển thị thông tin chi tiết về
giá trị pixel, đo khoảng cách và các thao tác hữu ích khác. Để khởi động Công cụ
Hình ảnh, hãy sử dụng chức năng imtool. Ví dụ: các câu lệnh sau đọc một hình ảnh
từ một tệp và sau đó hiển thị nó bằng imtool:
>> f = imread ( ' rose_1 024.t if' );
>> imtool (f)
Hình 2.4 cho thấy một số cửa sổ có thể xuất hiện khi sử dụng Công cụ Hình ảnh.
Cửa sổ lớn chính giữa là khung cảnh chính. Trong hình, nó đang hiển thị các pixel
hình ảnh ở độ phóng đại 400%, có nghĩa là mỗi pixel hình ảnh được hiển thị trên
một khối pixel màn hình 4 X 4. Văn bản trạng thái ở cuối cửa sổ chính hiển thị vị
trí cột / hàng (701, 360) và giá trị (18 1) của pixel nằm dưới con trỏ chuột (điểm
gốc của hình ảnh nằm trên cùng, bên trái). Công cụ Đo Khoảng cách đang được sử
dụng cho thấy khoảng cách giữa hai pixel được bao quanh bởi các hộp nhỏ là
25,65 đơn vị.
Cửa sổ Tổng quan, ở bên trái của Hình 2.4, hiển thị toàn bộ hình ảnh trong chế độ
xem hình thu nhỏ. Chế độ xem Cửa sổ Chính có thể được điều chỉnh bằng cách
kéo hình chữ nhật trong Cửa sổ Tổng quan. Cửa sổ Khu vực Pixel hiển thị các
pixel riêng lẻ từ vùng hình vuông nhỏ ở phía trên bên phải của bông hồng, được
thu phóng đủ lớn để xem các giá trị pixel thực tế.
Bảng 2.2 tóm tắt các công cụ và khả năng khác nhau liên quan đến Công cụ Hình
ảnh. Ngoài các công cụ này, thanh công cụ Cửa sổ Chính và Tổng quan cung cấp
các điều khiển cho các tác vụ như phóng to, xoay và cuộn hình ảnh.
2.4 Viết hình ảnh
Images are written to the Current Directory using function imwrite, which has the
following basic syntax:
imwrite ( f , ' filename ')
Với cú pháp này, chuỗi chứa trong filename phải bao gồm phần mở rộng định dạng
tệp được công nhận (xem Bảng 2.1). Ví dụ, lệnh sau đây ghi f vào một tệp có tên
patient10_run1. tif:
>> imwrite (f, ' patient10_run 1 .tif')
Function imwrite writes the image as a TIFF file because it recognizes the . tif
extension in the filename.
Ngoài ra, định dạng mong muốn có thể được chỉ định rõ ràng với đối số đầu vào
thứ ba. Cú pháp này hữu ích khi tệp mong muốn không sử dụng một trong các
phần mở rộng tệp được công nhận. Ví dụ: lệnh sau ghi f vào tệp TIFF được gọi là
patient10. run1:
>>imwrite (f, ' patient10 . run1 ', ' tif')
Hàm imwrite có thể có các tham số khác, tùy thuộc vào định dạng tệp được chọn.
Hầu hết công việc trong các chương sau đề cập đến hình ảnh JPEG hoặc TIFF, vì
vậy chúng tôi tập trung sự chú ý ở đây vào hai định dạng này. Cú pháp imwrite
tổng quát hơn chỉ áp dụng cho ảnh JPEG là
imwrite (f, ' f ilename.jpg ' , ' quality ', q)
trong đó q là số nguyên từ 0 đến 100 (số càng thấp thì độ suy giảm do nén JPEG
càng cao).
Hình 2.5 (a) cho thấy một hình ảnh, f, điển hình của các chuỗi hình ảnh thu được từ
một quá trình hóa học nhất định. Người ta muốn truyền những hình ảnh này một
cách thường xuyên đến một trang trung tâm để kiểm tra trực quan và / hoặc tự
động. Để giảm yêu cầu lưu trữ và thời gian truyền, điều quan trọng là hình ảnh
phải được nén càng nhiều càng tốt, đồng thời không làm suy giảm hình thức trực
quan của chúng vượt quá mức hợp lý. Trong trường hợp này, "hợp lý" có nghĩa là
không có đường viền sai nào có thể cảm nhận được. Hình 2.5 (b) đến (f) cho thấy
kết quả thu được khi ghi ảnh f vào đĩa (ở định dạng JPEG), với q = 50, 25, 1 5, 5
và 0, tương ứng. Ví dụ: cú pháp áp dụng cho q = 25 là
>> imwrite ( f , ' bubbles25.jpg ' , ' quality ', 25 )
Hình ảnh cho q = 15 [Hình. 2,5 (d)] có đường viền sai gần như không nhìn thấy,
nhưng hiệu ứng này trở nên khá rõ rệt đối với q = 5 và q = 0. Vì vậy, một giải pháp
có thể chấp nhận được với một số lề cho lỗi là nén hình ảnh với q = 25. Theo thứ
tự để có ý tưởng về độ nén đạt được và để có được các chi tiết tệp hình ảnh khác,
chúng ta có thể sử dụng hàm imfinfo, có cú pháp
imfinfo filename
trong đó tên tệp là tên tệp của hình ảnh được lưu trữ trên đĩa. Ví dụ
>> imfinfo bubble s25 .jpg
xuất ra thông tin sau (lưu ý rằng một số trường không chứa thông tin trong trường

hợp này):
trong đó Kích thước tệp tính bằng byte. Số byte trong hình ảnh gốc được tính bằng
cách nhân Chiều rộng với Chiều cao với Bi tDepth và chia kết quả cho 8. Kết quả
là 486948. Chia nó cho FileSize sẽ cho tỷ lệ nén: (486948/1 3849) = 35. 1 6 Tỷ lệ
nén này đạt được trong khi vẫn duy trì chất lượng hình ảnh phù hợp với yêu cầu
của ứng dụng. Ngoài những lợi thế rõ ràng về không gian lưu trữ, việc giảm thiểu
này cho phép truyền tải lượng dữ liệu không nén khoảng 35 lần trên mỗi đơn vị
thời gian.
Các trường thông tin được hiển thị bởi thông tin imf có thể được ghi lại thành một
biến cấu trúc gọi là có thể được sử dụng cho các tính toán tiếp theo. Sử dụng hình
ảnh trước làm ví dụ và để K biểu thị biến cấu trúc, chúng tôi sử dụng cú pháp
>> K = imf info ( ' bubbles25 . j pg ' );
để lưu trữ vào biến K tất cả các thông tin được tạo bởi lệnh imfinfo.
Thông tin được tạo bởi imf info được thêm vào biến cấu trúc bằng các trường,
phân cách với K bằng dấu chấm. Ví dụ: chiều cao và chiều rộng của hình ảnh hiện
được lưu trữ trong các trường cấu trúc K. Chiều cao và Chiều rộng K. Như một
minh họa, hãy xem xét việc sử dụng biến cấu trúc K sau đây để tính tỷ số nén cho
bubbles25. jpg:
>> K = imf info ( ' bubbles25.jpg ' );
>> image_bytes = K.Width*K. Height *K. BitDepth/8;
>> compressed_bytes = K . FileSize ;
>> compression_rat io = image_byt es/ compressed_bytes
comp ression_ratio
35 . 1612
Lưu ý rằng imfinfo đã được sử dụng theo hai cách khác nhau. Đầu tiên là gõ
imfinfo bubble25. j pg tại dấu nhắc, dẫn đến thông tin được hiển thị trên màn hình.
Thứ hai là nhập K = imf info ('bubble25. j pg'), dẫn đến thông tin được tạo bởi
thông tin imf được lưu trữ trong K. hai cách gọi khác nhau của thông tin imf là một
ví dụ về tính hai mặt của hàm lệnh, một khái niệm quan trọng được giải thích chi
tiết hơn trong Tài liệu MATLAB.
Cú pháp imwrite tổng quát hơn chỉ áp dụng cho t nếu hình ảnh có hình thức
imwrite (g, ' f ilename .tit ' , ' comp ression ', ' parameter ',…
' resolution ', [ colres rowres ]
trong đó 'tham số r' có thể có một trong các giá trị chính sau: 'none' cho biết không
nén; 'pack bits' (mặc định cho hình ảnh không nhị phân), 'lwz', 'deflate', 'jpeg',
'ccitt' (chỉ hình ảnh nhị phân; mặc định), 'fax3' (chỉ hình ảnh nhị phân) và 'fax4'.
Mảng 1 x 2 [col res rowres] chứa hai số nguyên cung cấp độ phân giải cột và độ
phân giải hàng theo dấu chấm trên mỗi đơn vị (giá trị mặc định là [72 72]). Ví dụ:
nếu kích thước hình ảnh tính bằng inch, màu là số chấm (pixel) trên inch (dpi) theo
hướng dọc và tương tự đối với các hàng theo hướng ngang. Việc chỉ định độ phân
giải theo một đại lượng vô hướng duy nhất, res, tương đương với việc viết [res
res). Như bạn sẽ thấy trong ví dụ sau, tham số độ phân giải TIFF có thể được sử
dụng để sửa đổi kích thước của hình ảnh trong tài liệu in.
Hình 2.6 (a) là hình ảnh tia X 8 bit, f, của một bảng mạch được tạo ra trong quá
trình kiểm tra chất lượng. Nó ở định dạng j pg, ở 200 dpi. Hình ảnh có kích thước
450 X 450 pixel, vì vậy kích thước in của nó là 2,25 X 2,25 inch. Chúng tôi muốn
lưu trữ hình ảnh này ở định dạng t if, không nén, dưới tên sf. Ngoài ra, chúng tôi
muốn giảm kích thước in của hình ảnh xuống còn 1 .5 X 1 .5 inch trong khi vẫn
giữ số điểm ảnh ở 450 X 450. Câu lệnh sau cho kết quả mong muốn:
» imwrite ( f, ' sf . ti f ' , ' compression ' , ' none ' , ' resolution ' , [ 300 300) )
Các giá trị của vectơ [colres rowres] được xác định bằng cách nhân 200 dpi với tỷ
lệ 2,25 / 1,5 cho ra 300 dpi. Thay vì tính toán theo cách thủ công, chúng tôi có thể
viết
>> res = round ( 200*2 . 25/1 .5) ;
>> imwrite (f, ' sf . tif ' , ' compression ', ' none ' , ' resolution ', res )

trong đó hàm vòng làm tròn đối số của nó thành số nguyên gần nhất. Điều quan
trọng cần lưu ý là số lượng pixel không bị thay đổi bởi các lệnh này. Chỉ kích
thước in của hình ảnh được thay đổi. Hình ảnh gốc 450 X 450 ở 200 dpi có kích
thước 2,25 X 2,25 inch. Hình ảnh 300 dpi mới [Hình. 2.6 (b)] là giống hệt nhau,
ngoại trừ việc 450 x 450 pixel của nó được phân phối trên một khu vực 1 .5 X 1 .5
inch. Các quy trình như vậy rất hữu ích để kiểm soát kích thước của hình ảnh trong
tài liệu in mà không làm giảm độ phân giải.
Đôi khi, cần phải xuất hình ảnh và biểu đồ ra đĩa theo cách chúng xuất hiện trên
màn hình nền MATLAB. Nội dung của cửa sổ hình có thể được xuất sang đĩa theo
hai cách. Đầu tiên là sử dụng menu kéo xuống Tệp trong cửa sổ hình (xem Hình
2.2) và sau đó chọn Lưu dưới dạng. Với tùy chọn này, người dùng có thể chọn vị
trí, tên tệp và định dạng. Kiểm soát nhiều hơn các tham số xuất bằng cách sử dụng
lệnh in:
print -fno -dfileformat - rresno filename
trong đó không đề cập đến số hình trong cửa sổ hình quan tâm, tệp định dạng đề
cập đến một trong các định dạng tệp trong Bảng 2.1, resno là độ phân giải theo dpi
và f ilename là tên mà chúng tôi muốn gán tệp. Ví dụ, để xuất nội dung của cửa sổ
hình trong Hình 2.2 dưới dạng tệp ti f ở 300 dpi và dưới tên hi_res_rose, chúng ta
sẽ nhập
>> print -f1 -dtiff -r300 hi_res_rose
Lệnh này sẽ gửi tệp hi_res_rose. ti f vào Thư mục Hiện tại. Nếu chúng ta nhập
print tại lời nhắc, MATLAB sẽ in (cho máy in mặc định) nội dung của cửa sổ hình
cuối cùng được hiển thị. Cũng có thể chỉ định các tùy chọn khác với in, chẳng hạn
như một thiết bị in cụ thể
2.5 Lớp
Mặc dù chúng tôi làm việc với tọa độ số nguyên, nhưng giá trị (cường độ) của
pixel không bị giới hạn là số nguyên trong MATLAB. Bảng 2.3 liệt kê các lớp
khác nhau được hỗ trợ bởi MATLAB và Công cụ xử lý hình ảnh để biểu diễn các
giá trị pixel. Tám mục đầu tiên trong bảng được gọi là các lớp số. Mục thứ chín là
lớp char (ký tự) và, như được hiển thị, mục cuối cùng là lớp logic.
Các lớp uint8 và logic được sử dụng rộng rãi trong xử lý ảnh và chúng là các lớp
thường gặp khi đọc ảnh từ các định dạng tệp ảnh như.TIFF hoặc JPEG. Các lớp
này sử dụng 1 byte để đại diện cho mỗi pixel. Một số nguồn dữ liệu khoa học,
chẳng hạn như hình ảnh y tế, yêu cầu nhiều dải động hơn được cung cấp bởi uint8,
do đó, các lớp uint 16 và int 16 thường được sử dụng cho dữ liệu đó. Các lớp này
sử dụng 2 byte cho mỗi phần tử mảng. Các lớp dấu phẩy động kép và đơn được sử
dụng cho các hoạt động tính toán chuyên sâu như biến đổi Fourier (xem Chương
4). Dấu phẩy động chính xác kép sử dụng 8 byte cho mỗi phần tử mảng, trong khi
dấu phẩy động chính xác đơn sử dụng 4 byte. Các lớp int8, uint32 và int32, mặc dù
được hỗ trợ bởi hộp công cụ, nhưng không được sử dụng phổ biến để xử lý ảnh.
2.6 Image Types
2.6.1 1 Gray-scale Images
Hình ảnh thang xám là một ma trận dữ liệu có các giá trị đại diện cho các sắc thái
của màu xám. Khi các phần tử của hình ảnh thang xám thuộc lớp uint8 hoặc
uint16, chúng có giá trị nguyên trong phạm vi (0, 255] hoặc (0, 65535], tương ứng.
Nếu hình ảnh thuộc loại kép hoặc đơn, các giá trị là số dấu phẩy động (xem hai
mục đầu tiên trong Bảng 2.3). Giá trị của hình ảnh thang xám kép và đơn thường
được chia tỷ lệ trong phạm vi [0, 1], mặc dù có thể sử dụng các phạm vi khác.
2.6.2 Binary Images
Hình ảnh nhị phân có một ý nghĩa rất cụ thể trong MATLAB. Ảnh nhị phân là một
mảng logic gồm Os và ls. Do đó, một mảng Os và ls có giá trị thuộc lớp dữ liệu, ví
dụ, uint8, không được coi là ảnh nhị phân trong MATLAB. Một mảng số được
chuyển đổi thành nhị phân bằng cách sử dụng hàm logic. Do đó, nếu A là một
mảng số bao gồm Os và ls, chúng ta tạo một mảng logic B bằng cách sử dụng câu
lệnh
B = logical (A)
Nếu A chứa các phần tử không phải là Os và ls, thì hàm logic sẽ chuyển đổi tất cả
các đại lượng khác không sang logic ls và tất cả các mục có giá trị 0 thành Os
logic. Sử dụng các toán tử quan hệ và logic (xem Phần 2.10.2) cũng dẫn đến các
mảng logic.
Để kiểm tra xem một mảng có thuộc loại logic lớp hay không, chúng ta sử dụng
hàm islogical:
islogical (C)
Nếu C là một mảng logic, hàm này trả về giá trị 1. Nếu không, nó trả về giá trị 0.
Các mảng logic có thể được chuyển đổi thành mảng số bằng cách sử dụng các hàm
chuyển đổi lớp được thảo luận trong Phần 2.7.
2.6.3 Lưu ý về thuật ngữ
Sự cẩn thận đáng kể đã được thực hiện trong hai phần trước để làm rõ việc sử dụng
loại thuật ngữ và loại hình ảnh. Nói chung, chúng tôi đề cập đến một hình ảnh là
"hình ảnh loại image_type lớp", trong đó lớp là một trong các mục nhập từ Bảng
2.3 và image_type là một trong các loại hình ảnh được xác định ở đầu phần này.
Do đó, một hình ảnh được đặc trưng bởi cả một lớp và một kiểu. Ví dụ: một tuyên
bố thảo luận về "hình ảnh tỷ lệ xám uint8" chỉ đơn giản là đề cập đến hình ảnh
thang độ xám có các pixel thuộc loại uint8. Một số hàm trong hộp công cụ hỗ trợ
tất cả các lớp dữ liệu được liệt kê trong Bảng 2.3, trong khi các hàm khác rất cụ thể
về những gì tạo thành một lớp hợp lệ.
2.7 Chuyển đổi giữa các lớp
Chuyển đổi hình ảnh từ lớp này sang lớp khác là một hoạt động phổ biến. Khi
chuyển đổi giữa các lớp, hãy ghi nhớ phạm vi giá trị của các lớp được chuyển đổi
(xem Bảng 2.3).
Cú pháp chung để chuyển đổi lớp là:
B = class_name (A)
trong đó tên lớp là một trong những tên trong cột đầu tiên của Bảng 2.3. Ví dụ, giả
sử rằng A là một mảng của lớp uint8. Mảng có độ chính xác kép, B, được tạo bởi
lệnh B = double (A). Nếu C là một mảng kép lớp trong đó tất cả các giá trị đều
nằm trong phạm vi [0, 255] (nhưng có thể chứa các giá trị phân số), nó có thể được
chuyển đổi thành mảng uint8 bằng lệnh D = uint8 (C). Nếu một mảng của lớp kép
có bất kỳ giá trị nào ngoài phạm vi [0, 255] và nó được chuyển đổi thành lớp uint8
theo cách vừa được mô tả, MATLAB sẽ chuyển đổi thành 0 tất cả các giá trị nhỏ
hơn 0 và chuyển đổi thành 255 tất cả các giá trị lớn hơn 255. Các số ở giữa được
làm tròn thành số nguyên gần nhất. Do đó, việc chia tỷ lệ thích hợp của một mảng
kép để các phần tử của nó nằm trong phạm vi [0, 255] là cần thiết trước khi chuyển
đổi nó thành uint8. Như đã chỉ ra trong Phần 2.6.2, việc chuyển đổi bất kỳ lớp dữ
liệu số nào thành lôgic sẽ tạo ra một mảng có lôgic 1 ở những vị trí mà mảng đầu
vào có giá trị khác không và Os lôgic ở những nơi mà mảng đầu vào chứa Os.

Hộp công cụ cung cấp các chức năng cụ thể (Bảng 2.4) thực hiện việc chia tỷ lệ và
ghi sổ kế toán khác cần thiết để chuyển đổi hình ảnh từ lớp này sang lớp khác. Ví
dụ: hàm im2uint8 tạo một hình ảnh uni ta sau khi phát hiện lớp dữ liệu của đầu vào
và thực hiện tất cả các tỷ lệ cần thiết để hộp công cụ nhận ra dữ liệu là dữ liệu hình
ảnh hợp lệ. Ví dụ, hãy xem xét hình ảnh f sau đây của lớp kép, có thể là kết quả
của một phép tính trung gian:
từ đó chúng ta thấy rằng hàm im2uint8 đặt thành 0 tất cả các giá trị trong đầu vào
nhỏ hơn 0, đặt thành 255 tất cả các giá trị trong đầu vào lớn hơn 1 và nhân tất cả
các giá trị khác với 255. Làm tròn kết quả của phép nhân thành số nguyên gần nhất
hoàn thành chuyển đổi.
Hàm im2double chuyển đổi một đầu vào thành lớp kép. Nếu đầu vào thuộc lớp
uint 8, uint 16 hoặc logic, hàm im2double sẽ chuyển nó thành lớp kép với các giá
trị trong phạm vi [0, 1]. Nếu đầu vào là lớp đơn hoặc đã là lớp kép, im2double trả
về một mảng có lớp kép, nhưng có giá trị bằng số với đầu vào. Ví dụ: nếu một
mảng lớp kép là kết quả từ các phép tính mang lại giá trị ngoài phạm vi [0, 1], thì
việc nhập mảng này vào im2double sẽ không có tác dụng. Như được giải thích bên
dưới, hàm mat2g ray có thể được sử dụng để chuyển đổi một mảng của bất kỳ lớp
nào trong Bảng 2.4 thành một mảng kép với các giá trị trong phạm vi [0, 1].
Như một minh họa, hãy xem xét hình ảnh lớp uint8
>> h = uint8 ( [ 25 50 ; 1 28 200 ] );
Thực hiện chuyển đổi
>> g = im2double (h)
mang lại kết quả

từ đó chúng ta suy ra rằng việc chuyển đổi khi đầu vào thuộc lớp uint8 được thực
hiện đơn giản bằng cách chia mỗi giá trị của mảng đầu vào cho 255. Nếu đầu vào
thuộc lớp uint16 thì phép chia cho 65535.
Hàm hộp công cụ mat2gray chuyển đổi hình ảnh của bất kỳ lớp nào trong Bảng 2.4
thành một mảng lớp được chia tỷ lệ kép thành phạm vi [0, 1]. Cú pháp gọi là
g = mat2gray (A, [ Amin , Amax ])
trong đó ảnh g có các giá trị trong khoảng từ 0 (đen) đến 1 (trắng). Các tham số
được chỉ định, Amin và Amax, sao cho các giá trị nhỏ hơn Amin trong A trở thành
0 tính bằng g và các giá trị lớn hơn Amax trong A tương ứng với I tính bằng g. Cú
pháp
g = mat2gray (A)
đặt các giá trị của Amin và Amax thành giá trị nhỏ nhất và lớn nhất thực tế bằng A.
Cú pháp thứ hai của tia mat2g là một công cụ rất hữu ích vì nó chia tỷ lệ toàn bộ
phạm vi giá trị trong đầu vào thành phạm vi [0, 1], độc lập với lớp của đầu vào, do
đó loại bỏ việc cắt bớt.
Cuối cùng, chúng tôi coi việc chuyển đổi thành lớp logic. (Nhớ lại rằng Hộp công
cụ xử lý hình ảnh xử lý các ma trận lôgic như hình ảnh nhị phân.) Hàm logical
chuyển đổi một mảng đầu vào thành một mảng lôgic. Trong quá trình này, các
phần tử khác không trong đầu vào được chuyển đổi thành ls và Os được chuyển
đổi thành Os trong đầu ra. Một quy trình chuyển đổi thay thế thường hữu ích hơn
là sử dụng toán tử quan hệ, chẳng hạn như>, với giá trị ngưỡng. Ví dụ, cú pháp
g=f>T
tạo ra một ma trận logic chứa ls ở bất kỳ nơi nào các phần tử của f lớn hơn T và Os
ở nơi khác.
Hàm hộp công cụ im2bw thực hiện 'hoạt động ngưỡng này' theo cách tự động điều
chỉnh ngưỡng được chỉ định theo những cách khác nhau, tùy thuộc vào loại hình
ảnh đầu vào. Cú pháp là
g = im2bw(f , T)
Giá trị được chỉ định cho ngưỡng T phải nằm trong phạm vi [0, 1], bất kể loại đầu
vào là gì. Chức năng tự động điều chỉnh giá trị ngưỡng theo. lớp hình ảnh đầu vào.
Ví dụ: nếu f là uint8 và T là 0. 4, thì im2bw ngưỡng các pixel trong f bằng cách so
sánh chúng với 255 * 0. 4 = 102.
Chúng tôi muốn chuyển đổi hình ảnh đôi, nhỏ sau đây
>> f= [ 1 2; 3 4]
f=
1 2
2 4
sang hệ nhị phân, sao cho các giá trị l và 2 trở thành 0 và hai giá trị còn lại trở
thành 1. Đầu tiên chúng ta chuyển nó thành phạm vi [0, 1]:
>> g = mat2gray (f)
g=
0 0.3333
0.6667 1.0000
Sau đó, chúng tôi chuyển đổi nó thành nhị phân bằng cách sử dụng một ngưỡng,
chẳng hạn như giá trị 0,6
>> gb = im2bw(g , 0.6 )
gb =
1 0
2 1
Giả sử bây giờ chúng ta muốn chuyển gb thành một mảng số Os và ls của lớp kép.
Điều này được thực hiện trực tiếp:
>> gbd = im2double (gb)
gbd =
1 0
2 1
Nếu gb thuộc lớp uint8, việc áp dụng im2double vào nó sẽ dẫn đến một mảng có
các giá trị
0 0
0.0039 0.0039
bởi vì im2double sẽ chia tất cả các phần tử cho 255. Điều này không xảy ra trong
chuyển đổi trước đó vì im2double đã phát hiện ra rằng đầu vào là một mảng ical
log, có các giá trị duy nhất có thể là 0 và 1. Nếu đầu vào trên thực tế thuộc lớp
uint8 và chúng tôi muốn chuyển nó thành class double trong khi vẫn giữ các giá trị
0 và 1, chúng tôi sẽ chuyển đổi mảng bằng cách viết
>>gbd = double(gb)
gbd =
0 0
1 1
Cuối cùng, chúng tôi chỉ ra rằng đầu ra của một hàm có thể được chuyển trực tiếp
làm đầu vào cho một hàm khác, vì vậy chúng tôi có thể bắt đầu với hình ảnh f và
đến cùng một kết quả bằng cách sử dụng câu lệnh một dòng
>> gbd = im2double ( im2bw ( mat2gray (f) , 0.6 ));
hoặc bằng cách sử dụng các nhóm một phần của các hàm này. Tất nhiên, toàn bộ
quá trình có thể được thực hiện trong trường hợp này bằng một lệnh đơn giản hơn:
>> gbd = double (f > 2 ) ;
chứng minh một lần nữa tính nhỏ gọn của ngôn ngữ MATLAB.
Vì hai mục đầu tiên trong Bảng 2.3 hiển thị dữ liệu số lớp của lớp kép yêu cầu lưu
trữ nhiều gấp đôi so với dữ liệu của lớp đơn. Trong hầu hết các ứng dụng xử lý
hình ảnh có sử dụng xử lý số, độ chính xác đơn là hoàn toàn phù hợp. Do đó, trừ
khi một ứng dụng cụ thể hoặc một MATLAB hoặc chức năng hộp công cụ yêu cầu
lớp kép, cách tốt là làm việc với dữ liệu đơn để tiết kiệm bộ nhớ. Một mẫu lập trình
nhất quán mà bạn sẽ thấy được sử dụng trong suốt cuốn sách để thay đổi đầu vào
thành lớp đơn như sau:
[ fout , revertclass ] = tofloat ( f );
g = some_operation ( fout )
g = revertclass( g ) ;
Hàm tofloat (xem Phụ lục C về mã) chuyển đổi hình ảnh đầu vào f thành dấu phẩy
động. Nếu f là ảnh kép hoặc ảnh đơn thì fout bằng f. Ngược lại, fout bằng
im2single (f). Lớp hoàn nguyên đầu ra có thể được sử dụng để chuyển đổi trở lại
cùng lớp với f. Nói cách khác, ý tưởng là chuyển đổi hình ảnh đầu vào thành đơn
lẻ, thực hiện các hoạt động bằng cách sử dụng độ chính xác đơn và sau đó, nếu
muốn, chuyển đổi hình ảnh đầu ra cuối cùng thành cùng lớp với đầu vào. Các lớp
hình ảnh hợp lệ cho f là những lớp được liệt kê trong cột thứ ba của bốn mục đầu
tiên trong Bảng 2.4: logic., Uint8, un int 1 6, int 1 6, double và single.
2.8 Lập chỉ mục mảng
MATLAB hỗ trợ một số lược đồ lập chỉ mục mạnh mẽ giúp đơn giản hóa thao tác
với mảng và nâng cao hiệu quả của chương trình. Trong phần này, chúng tôi thảo
luận và minh họa việc lập chỉ mục cơ bản trong một và hai chiều (tức là vectơ và
ma trận), cũng như các kỹ thuật lập chỉ mục hữu ích với ảnh nhị phân.
2.8.1 Vectơ lập chỉ mục
Như đã thảo luận trong Phần 2.1.2, mảng có kích thước 1 x N được gọi là vectơ
hàng. Các phần tử của một vectơ như vậy có thể được truy cập bằng cách sử dụng
một giá trị chỉ mục duy nhất (còn được gọi là chỉ số con). Do đó, v (1) là phần tử
đầu tiên của vectơ v, v (2) là phần tử thứ hai của nó, v.v. Vectơ có thể được tạo
trong MATLAB bằng cách bao quanh các phần tử, được phân tách bằng dấu cách
hoặc dấu phẩy, trong dấu ngoặc vuông. Ví dụ,
>> v = [1 3 5 7 9]
v
1 3 5 9
>> v(2)
ans =
3
Một vectơ hàng được chuyển đổi thành một vectơ cột (và ngược lại) bằng cách sử
dụng toán tử chuyển vị (. '):
>> w = v . '
w=
1
3
5
7
9
Để truy cập các khối phần tử, chúng tôi sử dụng ký hiệu dấu hai chấm của
MATLAB. Ví dụ, để truy cập ba phần tử đầu tiên của v, chúng tôi viết
>> v (1:3)
ans =
1 3 5
Tương tự, chúng ta có thể truy cập phần tử thứ hai thông qua phần tử thứ tư
>> v(2:4)
ans =
3 5 7
hoặc tất cả các phần tử từ phần tử thứ ba đến phần tử cuối cùng:
>> v(3:end)
ans =
5 7 9
trong đó end biểu thị phần tử cuối cùng trong vector. Lập chỉ mục không bị giới
hạn đối với các phần tử liền kề. Ví dụ,
>> v(1:2:end)
ans =
1 5 9
Ký hiệu 1: 2: end cho biết bắt đầu từ 1, đếm lên 2 và dừng khi số đếm đến phần tử
cuối cùng. Các bước có thể là tiêu cực:
>> v(end: -2: 1)
ans =
9 5 1
Ở đây, số lượng chỉ mục bắt đầu ở phần tử cuối cùng, giảm đi 2 và dừng lại khi
đến phần tử đầu tiên.
Hàm linspace, với cú pháp
x = linspace (a, b, n)
tạo ra một vectơ hàng x gồm n phần tử được phân cách tuyến tính giữa, và bao
gồm, a và b. Chúng tôi sử dụng chức năng này ở một số nơi trong các chương sau.
Một vectơ thậm chí có thể được sử dụng như một chỉ mục vào một vectơ khác. Ví
dụ: chúng ta có thể chọn phần tử đầu tiên, thứ tư và thứ năm của v bằng lệnh
>> v ([1 4 5])
ans =
1 7 9
Như chúng tôi trình bày trong phần sau, khả năng sử dụng một vectơ làm chỉ mục
vào một vectơ khác cũng đóng một vai trò quan trọng trong việc lập chỉ mục ma
trận.
2.8.2 Ma trận lập chỉ mục
Ma trận có thể được biểu diễn thuận tiện trong MATLAB dưới dạng một chuỗi các
vectơ hàng được bao bởi dấu ngoặc vuông và được phân tách bằng dấu chấm phẩy.
Ví dụ, gõ
>> A= [1 2 3; 4 5 6; 7 8 9]
cho ma trận 3 x 3
A=
1 2 3
4 5 6
7 8 9
Lưu ý rằng việc sử dụng dấu chấm phẩy bên trong dấu ngoặc vuông khác với việc
sử dụng chúng đã đề cập trước đó để chặn đầu ra hoặc để viết nhiều lệnh trong một
dòng duy nhất. Chúng tôi chọn các phần tử trong ma trận giống như chúng tôi đã
làm đối với vectơ, nhưng bây giờ chúng tôi cần hai chỉ số: một để thiết lập vị trí
hàng và chỉ số kia cho cột tương ứng. Ví dụ: để trích xuất phần tử ở hàng thứ hai,
thứ ba cột của ma trận A, chúng tôi viết
>>A(2, 3)
ans =
6
Một ma trận con của A có thể được trích xuất bằng cách chỉ định một vectơ giá trị
cho cả chỉ số hàng và chỉ số cột. Ví dụ: câu lệnh sau trích xuất ma trận con của A
chứa các hàng 1 và 2 và các cột 1, 2 và 3:
>>T2 = A ( [ 1 2 ] , [ 1 2 3] )
T2 =
1 2 3
4 5 6
Vì biểu thức 1: K tạo ra một vectơ có giá trị nguyên từ 1 đến K, nên câu lệnh trước
cũng có thể được viết dưới dạng:
>>E = A ( [1 3 ] , [3 2] )
E=
2 2
9 8
Kí hiệu A ([a b], [c d]) chọn các phần tử trong A có tọa độ (a, c), (a, d), (b, c), và
(b, d). Do đó, khi chúng ta cho E = A ([1 3], [3 2]), chúng ta đang chọn các phần tử
sau trong A: A (1, 3), A (1, 2), A (3, 3), và A (3, 2).
Chỉ mục hàng hoặc cột cũng có thể là một dấu hai chấm. Dấu hai chấm ở vị trí chỉ
mục hàng là ký hiệu viết tắt để chọn tất cả các hàng. Tương tự, dấu hai chấm ở vị
trí chỉ mục cột sẽ chọn tất cả các cột. Ví dụ, câu lệnh sau chọn toàn bộ cột thứ 3
của A:
>> C3 = A( : , 3)
C3 =
3
6
9
Tương tự, câu lệnh này trích xuất hàng thứ hai:
>> R2 = A ( 2 , : )
R2 =
4 5 6
Bất kỳ hình thức lập chỉ mục nào trước đó đều có thể được sử dụng ở phía bên trái
của câu lệnh gán. Hai câu lệnh tiếp theo tạo một bản sao, B, của ma trận A, sau đó
gán giá trị 0 cho tất cả các phần tử trong cột thứ 3 của B.
>> B = A;
>> B ( : ' 3) = 0
B=
1 2 0
4 5 0
7 8 0
Kết thúc từ khóa, khi nó xuất hiện ở vị trí chỉ mục hàng, là ký hiệu viết tắt cho
hàng cuối cùng. Khi end xuất hiện ở vị trí chỉ mục cột, nó cho biết cột cuối cùng.
Ví dụ: câu lệnh sau tìm phần tử trong hàng cuối cùng và cột cuối cùng của A:
>> A( end , end )
ans =
9
Khi được sử dụng để lập chỉ mục, từ khóa end có thể được trộn với các phép toán
số học, cũng như với toán tử dấu hai chấm. Ví dụ:
>> A(end , end - 2)
ans =
7
>> A(2 : end , end : -2:1 )
ans =
6 4
9 7
2.8.3 Lập chỉ mục với một dấu hai chấm
Việc sử dụng một dấu hai chấm làm chỉ số vào ma trận sẽ chọn tất cả các phần tử
của mảng và sắp xếp chúng (theo thứ tự cột) thành một vectơ cột duy nhất. Ví dụ,
với tham chiếu đến ma trận T2 trong phần trước
>> v = T2 ( :)
v=
1
4
2
5
3
6
Việc sử dụng dấu hai chấm này rất hữu ích khi, chẳng hạn, chúng ta muốn tìm tổng
của tất cả các phần tử của ma trận. Một cách tiếp cận là gọi hàm tổng hai lần:
>> col_sums = sum (A)
col_sum =
115 15 112
Hàm sum tính tổng của mỗi cột A, lưu trữ kết quả vào một vectơ hàng. Sau đó,
chúng ta lại gọi tổng, chuyển nó thành vectơ của tổng cột:
>> toltal_sum = sum(col_sums)
total_sum =
238
Một thủ tục dễ dàng hơn là sử dụng lập chỉ mục dấu hai chấm để chuyển đổi A
thành vectơ cột và chuyển kết quả thành tổng:
>> total sum = sum (A( :))
total_sum =
238
2.8.4 Lập chỉ mục logic
Một hình thức lập chỉ mục khác mà bạn sẽ thấy khá hữu ích là lập chỉ mục hợp lý.
Biểu thức lập chỉ mục logic có dạng A (D), trong đó A là một mảng và D là một
mảng logic có cùng kích thước với A. Biểu thức A (D) trích xuất tất cả các phần tử
của A tương ứng với các phần tử được đánh giá là 1 của D. Ví dụ,
>> D = logical ([1 0 0; 0 0 1; 0 0 0 ] )
D=
1 0 0
0 0 1
0 0 0
>> A(D)
ans =
1
6
trong đó A được định nghĩa ở đầu Phần 2.8.2. Đầu ra của phương pháp lập chỉ mục
logic này luôn là một vector cột.
Lập chỉ mục logic cũng có thể được sử dụng ở phía bên trái của câu lệnh gán. Ví
dụ, sử dụng cùng một D như trên,
>> A(D) = [ 30 40 ]
A=
30 2 3
4 5 40
7 8 9
Trong lần gán trước, số phần tử ở phía bên phải khớp với số phần tử được đánh giá
bằng 1 của D. Ngoài ra, phía bên phải có thể là một đại lượng vô hướng, như sau:
>> A(D) = 100
A=
100 2 3
4 5 100
7 8 9
Bởi vì ảnh nhị phân được biểu diễn dưới dạng mảng logic, chúng có thể được sử
dụng trực tiếp trong biểu thức lập chỉ mục logic để trích xuất giá trị pixel trong
hình ảnh tương ứng với] pixel được định giá trong ảnh nhị phân. Bạn sẽ thấy nhiều
ví dụ sau trong cuốn sách sử dụng hình ảnh nhị phân và lập chỉ mục logic.
2.8.5 Lập chỉ mục tuyến tính
Loại lập chỉ mục cuối cùng hữu ích cho việc xử lý hình ảnh là lập chỉ mục tuyến
tính. Biểu thức lập chỉ mục tuyến tính là biểu thức sử dụng một chỉ số con để lập
chỉ mục ma trận hoặc mảng chiều cao hơn. Để minh họa khái niệm, chúng tôi sẽ sử
dụng ma trận Hilbert 4 X 4 làm ví dụ:

H ([2 11]) là một ví dụ về biểu thức lập chỉ mục tuyến tính:

Để xem kiểu lập chỉ mục này hoạt động như thế nào, hãy đánh số các phần tử của
H từ cột đầu tiên đến cột cuối cùng theo thứ tự được hiển thị:

Ở đây bạn có thể thấy rằng H ([2 11]) trích xuất phần tử thứ 2 và 1 của H, dựa trên
sơ đồ đánh số trước đó.
Trong xử lý hình ảnh, lập chỉ mục tuyến tính rất hữu ích để trích xuất một tập hợp
các giá trị pixel từ các vị trí tùy ý. Ví dụ: giả sử chúng ta muốn một biểu thức trích
xuất các giá trị của H tại các tọa độ hàng-cột (1, 3), (2, 4) và (4, 3):
>> r [ 1 2 4 ];
>> c [3 4 3] ;
Biểu thức H (r, c) không làm những gì chúng ta muốn, như bạn có thể thấy:

Thay vào đó, chúng tôi chuyển đổi tọa độ hàng-cột thành giá trị chỉ số tuyến tính,
như sau:

Các hàm MATLAB sub2ind và ind2sub chuyển đổi qua lại giữa các chỉ số dưới cột
hàng và chỉ số tuyến tính. Ví dụ,

Lập chỉ mục tuyến tính là yếu tố cơ bản trong các vòng lặp vectơ hóa để tối ưu hóa
chương trình, như đã thảo luận trong Phần 2.10.5.
Hình ảnh trong Hình 2.7 (a) là một hình ảnh tỷ lệ xám 1024 X 1024, f, thuộc lớp
uint8. Hình ảnh trong Hình 2.7 (b) được lật theo chiều dọc bằng cách sử dụng câu
lệnh
>> fp = f (end : - 1 :1, :);
Hình ảnh trong Hình 2.7 (c) là một phần ngoài hình ảnh (a), thu được bằng lệnh
>> fc = f (257: 768, 257: 768);
Tương tự, Hình 2.7 (d) cho thấy một hình ảnh được lấy mẫu con thu được bằng
cách sử dụng câu lệnh
>> fs = f (1: 2: end, 1: 2: end);
Cuối cùng, Hình 2.7 (e) cho thấy một đường quét ngang qua giữa Hình 2.7 (a),
thu được bằng cách sử dụng lệnh
»Plot (f (5 12,:))
Biểu đồ chức năng được thảo luận trong Phần 3.3.1.
2.8.5 Chọn kích thước mảng
Hoạt động của biểu mẫu
operation (A, dim)
trong đó operation biểu thị một phép toán MATLAB có thể áp dụng, A là một
mảng và dim là một đại lượng vô hướng, được sử dụng thường xuyên trong cuốn
sách này. Ví dụ: nếu A là 2-Darray, câu lệnh
>> k = size (A, 1);
cho kích thước của A dọc theo kích thước đầu tiên của nó (tức là nó cho số hàng
trong A). Tương tự, kích thước thứ hai của một mảng là theo hướng ngang, vì vậy
kích thước câu lệnh (A, 2) cho số cột trong A. Sử dụng các khái niệm này, chúng ta
có thể viết lệnh cuối cùng trong Ví dụ 2.5 như
>> plot (f (size (f, 1) / 2,:))
MATLAB không giới hạn số chiều của một mảng, do đó, có thể trích xuất các
thành phần của mảng theo bất kỳ thứ nguyên nào là một tính năng quan trọng.
Phần lớn, chúng tôi xử lý mảng 2-D, nhưng có một số trường hợp (như khi làm
việc với hình ảnh màu hoặc đa ảnh) khi cần có thể "xếp chồng" hình ảnh dọc theo
chiều thứ ba hoặc cao hơn. Chúng tôi giải quyết vấn đề này trong các Chương 7, 8,
12 và 13. Hàm ndims, với cú pháp
d = ndims (A)
cho biết số kích thước của mảng A. Hàm ndims không bao giờ trả về giá trị nhỏ
hơn 2 vì các vô hướng chẵn được coi là hai chiều, theo nghĩa chúng là mảng có
kích thước 1 x 1.
2.8.6 Ma trận thưa thớt Sparse Matrices
Khi một ma trận có số lượng Os lớn, sẽ có lợi khi thể hiện nó ở dạng thưa thớt để
giảm yêu cầu lưu trữ. Hàm thưa thớt chuyển đổi ma trận sang dạng thưa thớt bằng
cách "loại bỏ" tất cả các phần tử bằng không. Cú pháp cơ bản cho hàm này là
S = sparse(A)

từ đó chúng ta thấy rằng S chỉ chứa các vị trí (hàng, cột) của các phần tử khác
không (lưu ý rằng các phần tử được sắp xếp theo cột). Để khôi phục ma trận ban
đầu (đầy đủ), chúng tôi sử dụng hàm full:
Một cú pháp đôi khi được sử dụng với hàm thưa thớt có năm đầu vào:
S = sparse ( r , c, s, m, n)
trong đó r và c lần lượt là các vectơ chứa chỉ số hàng và cột của các phần tử khác
không của ma trận mà chúng ta muốn biểu diễn ở dạng thưa thớt. Tham số s là một
vectơ chứa các giá trị tương ứng với các cặp chỉ số (r, c), và m và n là kích thước
hàng và cột của ma trận. Ví dụ: ma trận S trước đó có thể được tạo trực tiếp bằng
lệnh

Phép toán số học và các phép toán khác (Phần 2.10.2) trên ma trận thưa được thực
hiện theo cách giống hệt như với ma trận đầy đủ. Có một số dạng cú pháp khác cho
hàm thưa thớt, như được trình bày chi tiết trong trang trợ giúp cho hàm này.
2.9 Một số Mảng Tiêu chuẩn Quan trọng
Đôi khi, rất hữu ích khi có thể tạo mảng hình ảnh với các đặc điểm đã biết để
thử các ý tưởng và kiểm tra cú pháp của các hàm trong quá trình phát triển.
Trong phần này, chúng tôi giới thiệu tám hàm tạo mảng được sử dụng trong
các chương sau. Nếu chỉ có một đối số được bao gồm trong bất kỳ hàm nào
sau đây, kết quả là một mảng vuông
 zeros(M, N) tạo ra một ma trận M x N gồm Os của lớp kép.
 ones ( M, N) tạo ra một ma trận M x N gồm các ls của lớp kép.
 true ( M, N) tạo ra một ma trận logic M x N của ls.
 false (M, N) tạo ma trận lôgic M x N của Os.
 magic ( M) tạo ra một M x M "Magic square". Đây là một mảng vuông
trong đó
tổng dọc theo bất kỳ hàng, cột hoặc đường chéo chính nào, đều giống
nhau. Hình vuông ma thuật là mảng hữu ích cho mục đích thử nghiệm
vì chúng dễ tạo và số của chúng là số nguyên
 eye ( M) tạo ma trận nhận dạng M x M.
 rand ( M, N) tạo ra một ma trận M x N có các mục nhập là các số ngẫu
nhiên được phân phối đồng đều trong khoảng [0, 1].
 randn ( M, N) tạo ra một ma trận M x N có các số được phân phối chuẩn
(tức là Gaussian) các số ngẫu nhiên với trung bình 0 và phương sai l.
For example,

2.10Giới thiệu về Lập trình M-Function


Một trong những tính năng mạnh mẽ nhất của MATLAB là khả năng nó cung
cấp cho người dùng để lập trình các chức năng mới của riêng họ. Như bạn sẽ
tìm hiểu ngay sau đây, lập trình hàm MATLAB rất linh hoạt và đặc biệt dễ
học.
2.10.1 M-Files
M-files trong MATLAB (xem Phần 1 .3) có thể là các tập lệnh chỉ thực thi
một loạt các câu lệnh MATLAB hoặc chúng có thể là các hàm có thể chấp
nhận các đối số và có thể tạo ra một hoặc nhiều đầu ra. Trọng tâm của phần
này là các hàm M-file. Các chức năng này mở rộng khả năng của cả
MATLAB và Hộp công cụ xử lý hình ảnh để giải quyết các ứng dụng cụ thể,
do người dùng xác định. M-tệp được tạo bằng trình soạn thảo văn bản và được
lưu trữ với tên của tên tệp biểu mẫu. m, chẳng hạn như average .m và filte r.m.
Các thành phần của một M-file hàm là
 Dòng định nghĩa hàm
 Dòng H1
 Văn bản trợ giúp
 Cơ quan chức năng
 Bình luận
Đường định nghĩa hàm có dạng
function [ outputs] = name ( inputs )
Ví dụ: một hàm để tính tổng và tích (hai đầu ra khác nhau) của hai hình ảnh sẽ có
dạng
function [s, p] = sumprod (f, g)
trong đó f và g là ảnh đầu vào, s là ảnh tổng và p là ảnh sản phẩm. Tên của thanh
hút bể phốt được chọn tùy ý (tuân theo các ràng buộc ở cuối đoạn này), nhưng
chức năng từ luôn xuất hiện ở bên trái, dưới dạng được hiển thị. Lưu ý rằng các đối
số đầu ra được bao bởi dấu ngoặc vuông và đầu vào được bao bởi dấu ngoặc đơn.
Nếu hàm có một đối số đầu ra, thì có thể chấp nhận liệt kê đối số không có dấu
ngoặc. Nếu hàm không có đầu ra, chỉ sử dụng hàm từ, không có dấu ngoặc hoặc
dấu bằng. Tên hàm phải bắt đầu bằng một chữ cái và các ký tự còn lại có thể là bất
kỳ sự kết hợp nào của các chữ cái, số và dấu gạch dưới. Không có khoảng trắng
nào được phép. MATLAB nhận dạng tên hàm dài tối đa 63 ký tự. Các ký tự bổ
sung bị bỏ qua.
Các hàm có thể được gọi tại dấu nhắc lệnh. Ví dụ
>> [s, p] = sumprod (f, g ) ;
hoặc chúng có thể được sử dụng như các phần tử của các hàm khác, trong trường
hợp đó chúng trở thành hàm con. Như đã lưu ý trong đoạn trước, nếu đầu ra có một
đối số, thì có thể chấp nhận viết nó mà không có dấu ngoặc, như trong
>> y = sum(x) ;
Dòng H 1 là dòng văn bản đầu tiên. Nó là một dòng chú thích duy nhất theo sau
dòng định nghĩa hàm. Không được có dòng trống hoặc khoảng trống ở đầu giữa
dòng H1 và dòng định nghĩa hàm. Ví dụ về dòng H1 là% SUMPROD Tính tổng và
tích của hai hình ảnh.
Dòng H1 là văn bản đầu tiên xuất hiện khi người dùng nhập
>> help funct ion_name
at the MATLAB prompt. Typing lookfor keywo rd displays all the H1 lines
containing the string keyword. This line provides important summary information
about the M-file, so it should be as descriptive as possible.
Văn bản trợ giúp là một khối văn bản theo sau dòng Hl, không có bất kỳ dòng
trống nào ở giữa hai. Văn bản trợ giúp được sử dụng để cung cấp nhận xét và trợ
giúp trên màn hình cho chức năng. Khi người dùng nhập trợ giúp hàm ion_name
tại dấu nhắc, MATLAB hiển thị tất cả các dòng chú thích xuất hiện giữa dòng định
nghĩa hàm và dòng đầu tiên (thực thi hoặc trống). Hệ thống trợ giúp bỏ qua bất kỳ
dòng chú thích nào xuất hiện sau khối văn bản Trợ giúp.
Phần thân hàm chứa tất cả mã MATLAB thực hiện các phép tính và gán giá trị cho
các đối số đầu ra. Một số ví dụ về mã MATLAB được đưa ra sau trong chương
này.
Tất cả các dòng đứng trước ký hiệu "%" không phải là dòng HI hoặc văn bản Trợ
giúp được coi là dòng chú thích chức năng và không được coi là một phần của khối
văn bản Trợ giúp. Được phép thêm các bình luận vào cuối dòng mã.
Các tệp M có thể được tạo và chỉnh sửa bằng bất kỳ trình soạn thảo văn bản nào và
được lưu với phần mở rộng .m trong một thư mục cụ thể, thường là trong đường
dẫn tìm kiếm MATLAB. Một cách khác để tạo hoặc chỉnh sửa tệp M là sử dụng
chức năng chỉnh sửa tại dấu nhắc. Ví dụ,
>> edit sumprod
mở để chỉnh sửa sản phẩm sum của tệp. m nếu tệp tồn tại trong thư mục nằm trong
đường dẫn MATLAB hoặc trong Thư mục hiện tại. Nếu không tìm thấy tệp,
MATLAB cung cấp cho người dùng tùy chọn để tạo tệp đó. Cửa sổ trình soạn thảo
MATLAB có nhiều menu kéo xuống cho các tác vụ như lưu, xem và gỡ lỗi tệp.
Bởi vì nó thực hiện một số kiểm tra đơn giản và sử dụng màu sắc để phân biệt giữa
các phần tử khác nhau của mã, trình soạn thảo văn bản MATLAB được khuyến
nghị là công cụ được lựa chọn để viết và chỉnh sửa các hàm M.
2.10.2 Operators
Các toán tử MATLAB được nhóm thành ba loại chính:
• Toán tử số học thực hiện các phép tính số
• Các toán tử quan hệ so sánh các toán hạng một cách định lượng
• Các toán tử logic thực hiện các chức năng VÀ, HOẶC và KHÔNG
Chúng sẽ được thảo luận trong phần còn lại của phần này.
Toán tử số học
MATLAB có hai loại phép toán số học khác nhau. Các phép toán số học ma trận
được xác định bởi các quy tắc của đại số tuyến tính. Các phép toán số học mảng
được thực hiện từng phần tử và có thể được sử dụng với mảng nhiều chiều. Ký tự
dấu chấm (chấm) (.) Phân biệt các phép toán mảng với các phép toán ma trận. Ví
dụ: A * B biểu thị phép nhân ma trận theo nghĩa truyền thống, trong khi A. * B
biểu thị phép nhân mảng, theo nghĩa kết quả là một mảng, cùng kích thước với A
và B, trong đó mỗi phần tử là tích của phần tử của A và B. Nói cách khác, nếu C =
A. * B, thì C (I, J) = A (I, J) * B (I, J). Bởi vì các phép toán ma trận và mảng giống
nhau đối với phép cộng và trừ, các cặp ký tự. + và. - không được sử dụng. Khi viết
một biểu thức chẳng hạn như B = A, MATLAB "lưu ý" rằng B bằng A, nhưng
không thực sự sao chép dữ liệu vào B trừ khi nội dung của A thay đổi sau đó trong
chương trình. Đây là một điểm quan trọng vì việc sử dụng các biến khác nhau để ''
lưu trữ "cùng một thông tin đôi khi có thể nâng cao độ rõ ràng và dễ đọc của mã.
Do đó, việc MATLAB không trùng lặp thông tin trừ khi thực sự cần thiết là điều
đáng ghi nhớ khi viết mã MATLAB. Bảng 2.5 liệt kê các toán tử số học
MATLAB, trong đó A và B là ma trận hoặc mảng và a và b là các toán hạng vô
hướng. Tất cả các toán hạng có thể là thực hoặc phức. Dấu chấm hiển thị trong
toán tử mảng là không cần thiết nếu các toán hạng là vô hướng. Vì hình ảnh là 2-
Mảng D, tương đương với ma trận, tất cả các toán tử trong bảng đều có thể áp
dụng cho hình ảnh.
Sự khác biệt giữa các phép toán mảng và ma trận là quan trọng. Ví dụ, hãy xem xét
những điều sau
Tích mảng của A và B cho kết quả

trong khi sản phẩm ma trận cho kết quả quen thuộc:

Hầu hết các phép toán số học, quan hệ và logic liên quan đến hình ảnh là các phép
toán mảng.
Ví dụ 2.6, để làm theo, sử dụng các hàm max và min. Hàm trước đây có các dạng
cú pháp
Ở dạng đầu tiên, nếu A là một vectơ thì max (A) trả về phần tử lớn nhất của nó;
nếu A là ma trận thì max (A) coi các cột của A là vectơ và trả về vectơ hàng chứa
phần tử lớn nhất từ mỗi cột. Ở dạng thứ hai, max (A, B) trả về một mảng có cùng
kích thước với A và B với các phần tử lớn nhất được lấy từ A hoặc B. Ở dạng thứ
ba, max (A, [], dim) trả về các phần tử lớn nhất cùng thứ nguyên của A được xác
định bằng dim vô hướng. Ví dụ: max (A, [), 1) tạo ra các giá trị lớn nhất dọc theo
chiều đầu tiên (các hàng) của A. Cuối cùng, [C, I] = max (...) cũng tìm các chỉ số
của các giá trị lớn nhất của A và trả về chúng trong vectơ đầu ra I. Nếu có các giá
trị lớn nhất trùng lặp, chỉ số của giá trị đầu tiên được tìm thấy sẽ được trả về. Các
dấu chấm cho biết cú pháp được sử dụng ở bên phải của bất kỳ biểu mẫu nào trong
ba biểu mẫu trước đó. Hàm min có cùng dạng cú pháp vừa được mô tả cho hàm
max.
Giả sử rằng chúng ta muốn viết một hàm M, gọi nó là imblend, tạo thành một ảnh
mới dưới dạng tổng có trọng số bằng nhau của hai ảnh đầu vào. Hàm sẽ xuất ra
hình ảnh mới, cũng như các giá trị tối đa và tối thiểu của hình ảnh mới. Sử dụng
trình soạn thảo MATLAB, chúng tôi viết hàm mong muốn như sau:

Tuân thủ việc sử dụng lập chỉ mục dấu hai chấm, như đã thảo luận trong Phần
2.8.1, để tính giá trị tối thiểu và tối đa. Giả sử rằng f = [1 2; 3 4] và g = [1 2; 2 1].
Gọi imblend với các đầu vào này dẫn đến kết quả sau:
>> [w, wmax , wmin ] = imblend (f, g)
Lưu ý trong đoạn mã để hiểu rằng hình ảnh đầu vào, f và g, đã được nhân với trọng
số (0,5) trước khi được cộng lại với nhau. Thay vào đó, chúng ta có thể sử dụng
câu lệnh
>> w = 0.5 * (f + g ) ;
Tuy nhiên, biểu thức này không hoạt động tốt đối với các lớp số nguyên vì khi
MATLAB đánh giá biểu thức con (f + g), nó bão hòa bất kỳ giá trị nào làm tràn
phạm vi của lớp f và g. Ví dụ, hãy xem xét các đại lượng vô hướng sau

Thay vì nhận tổng là 300, tổng được tính toán bão hòa thành giá trị lớn nhất cho
lớp uint8. Vì vậy, khi chúng ta nhân tổng với 0,5, chúng ta nhận được kết quả
không chính xác:
>> d = 0.5 * t
d=
128
So sánh điều này với kết quả khi chúng tôi nhân với trọng số trước khi cộng:
Một giải pháp thay thế tốt là sử dụng hàm số học hình ảnh imlincomb, tính toán
tổng trọng số của các hình ảnh, cho bất kỳ tập hợp trọng số nào và bất kỳ số lượng
hình ảnh nào. Cú pháp gọi cho hàm này là
g = imlincomb (k1 , f 1 , k2 , f2 , ... )
Ví dụ: sử dụng các giá trị vô hướng trước đó,
>> w = imlincomb (0.5, f, 0.5, g)
W=
150
Nhập trợ giúp bắt chước tại dấu nhắc lệnh cho kết quả đầu ra sau:

Toán tử quan hệ
Các toán tử quan hệ MATLAB được liệt kê trong Bảng 2.6. Đây là các toán tử
mảng; nghĩa là chúng so sánh các cặp phần tử tương ứng trong các mảng có kích
thước bằng nhau.
Mặc dù việc sử dụng chính của các toán tử quan hệ là trong điều khiển luồng (ví
dụ, trong câu lệnh if), được thảo luận trong Phần 2.10.3, chúng tôi minh họa ngắn
gọn cách các toán tử này có thể được sử dụng trực tiếp trên mảng. Hãy xem xét
những điều sau:
>> A= [1 2 3; 4 5 6; 7 8 9]
Chúng ta thấy rằng phép toán A == B tạo ra một mảng logic có cùng kích thước
với A và B, với ls ở những vị trí mà các phần tử tương ứng của A và B khớp với
nhau và Os ở nơi khác. Như một minh họa khác, câu lệnh

tạo ra một mảng logic với ls trong đó các phần tử của A lớn hơn hoặc bằng các
phần tử tương ứng của B và Os ở nơi khác.
Trong các toán tử quan hệ, cả hai toán hạng phải có cùng kích thước trừ khi một
toán hạng là vô hướng. Trong trường hợp này, MATLAB kiểm tra tính vô hướng
đối với mọi phần tử của toán hạng khác, tạo ra một mảng logic có cùng kích thước
với toán hạng, với ls ở những vị trí thỏa mãn quan hệ được chỉ định và Os ở nơi
khác. Nếu cả hai toán hạng đều là đại lượng vô hướng, kết quả là 1 nếu thỏa mãn
quan hệ được chỉ định và 0 nếu không.
Các toán tử và hàm logic
Bảng 2.7 liệt kê các toán tử logic của MATLAB và ví dụ sau minh họa một số
thuộc tính của chúng. Không giống như hầu hết các cách giải thích thông thường
về toán tử logic, các toán tử trong Bảng 2.7 có thể hoạt động trên cả dữ liệu logic
và dữ liệu số. MATLAB coi đại lượng số logic 1 hoặc số khác là t rue và số logic 0
hoặc số 0 là false trong tất cả các phép thử logic. Ví dụ, AND của hai toán hạng là
1 nếu cả hai toán hạng đều là logic ls hoặc cả hai đều là số khác không. Phép toán
AND bằng 0 nếu một trong các toán hạng của nó là 0 về mặt logic hoặc số, hoặc
nếu cả hai đều bằng 0 về mặt logic hoặc số.
Các toán tử & tôi hoạt động trên các mảng; chúng tính toán AND và OR tương ứng
trên các phần tử tương ứng của đầu vào. Các toán tử && và 11 chỉ hoạt động trên
các đại lượng vô hướng. Chúng được sử dụng chủ yếu với các dạng khác nhau của
vòng lặp if, while và for, tất cả đều được thảo luận trong Phần 2.10.3.

Chúng ta thấy rằng toán tử & tạo ra một mảng logic có cùng kích thước với các
mảng đầu vào và có giá trị 1 tại các vị trí mà cả hai toán hạng đều khác không và
Os ở nơi khác. Một lần nữa, lưu ý rằng tất cả các hoạt động được thực hiện trên các
cặp phần tử tương ứng của mảng. Toán tử I hoạt động theo cách tương tự. Biểu
thức I là t rue nếu một trong hai toán hạng là đại lượng logic 1 hoặc số khác, hoặc
nếu cả hai đều là số logic hoặc số khác; nếu không thì nó là sai. Toán tử - hoạt
động với một toán hạng duy nhất. Về mặt logic, nếu toán hạng là true, toán tử -
chuyển nó thành false. Khi sử dụng - với dữ liệu số, mọi toán hạng khác không sẽ
trở thành 0 và mọi toán hạng 0 sẽ trở thành 1. Nếu bạn cố gắng sử dụng toán tử
logic vô hướng && hoặc 11 với toán hạng nonscalar, MATLAB sẽ gây ra lỗi.
MATLAB cũng hỗ trợ các hàm logic được tóm tắt trong Bảng 2.8. Tất cả và bất kỳ
chức năng nào đặc biệt hữu ích trong lập trình.
xét các mảng A = [1 2 3; 4 5 6) và B = [O -1 1; 0 0 2]. Việc thay thế các mảng này
vào các hàm trong Bảng 2.8 sẽ thu được các kết quả sau:
Lưu ý cách các hàm all và any hoạt động trên các cột của A và B. Ví dụ: hai phần
tử đầu tiên của vectơ được tạo bởi tất cả (B) là 0 vì mỗi cột trong số hai cột đầu
tiên của B chứa ít nhất một O; phần tử cuối cùng là 1 vì tất cả các phần tử trong cột
cuối cùng của B đều khác không.
Ngoài các hàm được liệt kê trong Bảng 2.8, MATLAB cung cấp một số hàm khác
kiểm tra sự tồn tại của các điều kiện hoặc giá trị cụ thể và trả về kết quả logic. Một
số chức năng này được liệt kê trong Bảng 2.9. Một vài trong số họ giải quyết các
thuật ngữ và khái niệm đã được thảo luận trước đó trong chương này; những người
khác được sử dụng trong các cuộc thảo luận tiếp theo. Các hàm trong Bảng 2.9 trả
về lôgic 1 khi điều kiện đang được kiểm tra là đúng; nếu không thì chúng trả về
lôgic 0. Khi đối số là một mảng, một số hàm trong Bảng 2.9 mang lại một mảng có
cùng kích thước với đối số chứa ls lôgic ở các vị trí thỏa mãn phép thử được thực
hiện bởi hàm và Os lôgic ở nơi khác. Ví dụ, nếu A = [1 2; 3 1/0], hàm vô nghiệm
(A) trả về ma trận [1 1; 1 0], trong đó mục nhập 0 (false) chỉ ra rằng phần tử cuối
cùng của A không hữu hạn.

Some important Values


Các hàm trong Bảng 2.10 trả về các giá trị được sử dụng nhiều trong lập trình
MATLAB. Ví dụ: eps thường được thêm vào mẫu số trong biểu thức để ngăn chặn
tràn khi mẫu số trở thành 0.
Biểu diễn số dấu phẩy động
MATLAB sử dụng ký hiệu thập phân thông thường, với dấu thập phân tùy chọn và
dấu cộng hoặc dấu trừ đứng đầu, cho các số. Kí hiệu khoa học sử dụng chữ e để chỉ
định hệ số thang đo lũy thừa mười. Các số tưởng tượng sử dụng i hoặc j làm hậu
tố. Một số ví dụ về biểu diễn số hợp lệ là

Theo mặc định, các số được lưu trữ nội bộ bằng cách sử dụng định dạng dài được
chỉ định bởi tiêu chuẩn dấu phẩy động của Viện Kỹ sư Điện và Điện tử (IEEE).
Thông thường, định dạng này được gọi là dấu chấm động chính xác kép và tương
ứng với lớp MATLAB kép. Như đã thảo luận trong Phần 2.5 (xem Bảng 2.3), số
dấu phẩy động có độ chính xác kép có độ chính xác là 16 chữ số thập phân có
nghĩa và phạm vi xấp xỉ ± 10 ^ + 308. Số dấu phẩy động có độ chính xác đơn có
độ chính xác là 7 chữ số thập phân có nghĩa và một phạm vi xấp xỉ ±10^+38.

Formats
Chức năng định dạng. với các hình thức sau
format
format type
format ( ' type ' )
được sử dụng để kiểm soát cách dữ liệu số được hiển thị trong Cửa sổ lệnh (chỉ
hiển thị bị ảnh hưởng, không phải cách MATLAB tính toán và lưu trữ dữ liệu số).
Biểu mẫu đầu tiên thay đổi định dạng đầu ra thành mặc định thích hợp cho lớp dữ
liệu đang được sử dụng; thứ hai thay đổi định dạng thành loại được chỉ định; và
dạng thứ ba là dạng hàm của cú pháp. Bảng 2.11 cho thấy các loại định dạng được
quan tâm trong cuốn sách này và các ví dụ sau minh họa việc sử dụng chúng bằng
cách hiển thị số pi ở các định dạng khác nhau.
Để xác định định dạng hiện đang được sử dụng, chúng tôi viết

Khi định dạng được đặt thành ngắn, cả pi và đơn (pi) đều hiển thị dưới dạng giá trị
5 chữ số:

Để sử dụng ký hiệu hàm mũ, chúng ta nhập và kết quả sẽ giống nhau. Như một bài
tập, bạn nên tra cứu trang trợ giúp cho hàm fo rmat và thử nghiệm với các kiểu
định dạng khác.
2.10.3Flow Control
Khả năng kiểm soát luồng hoạt động dựa trên một tập hợp các điều kiện được
xác định trước là trọng tâm của tất cả các ngôn ngữ lập trình. Trên thực tế,
phân nhánh có điều kiện là một trong hai phát triển quan trọng dẫn đến việc
hình thành các máy tính đa năng vào những năm 1940 (phát triển khác là sử
dụng bộ nhớ để chứa các chương trình và dữ liệu được lưu trữ). MATLAB
cung cấp tám câu lệnh điều khiển luồng được tóm tắt trong Bảng 2.12. Hãy ghi
nhớ quan sát được thực hiện trong phần trước rằng MATLAB coi số logic 1
hoặc số khác không là t rue và số logic hoặc số 0 là sai.
if, else, and else if
Câu lệnh điều kiện nếu có cú pháp
if expression
statements
end
Biểu thức được đánh giá và, nếu kết quả đánh giá là true, MATLAB
thực hiện một hoặc nhiều lệnh, được biểu thị ở đây là s tatements, giữa các
dòng if và end. Nếu biểu thức là false, MATLAB sẽ bỏ qua tất cả các câu lệnh
giữa dòng if và end và tiếp tục thực thi ở dòng sau dòng kết thúc. Khi lồng các
ifs, mỗi if phải được ghép nối với một kết thúc phù hợp.
Câu lệnh else và elseif điều kiện hóa thêm câu lệnh if. Cú pháp chung là
if expression 1
statements 1
elseif
expression2
statements2
else
statements3
end
Nếu biểu thức 1 là true, các biểu thức 1 được thực hiện và điều khiển được
chuyển đến câu lệnh kết thúc. Nếu biểu thức 1 được đánh giá là sai, thì biểu
thức 2 được đánh giá. Nếu biểu thức này đánh giá là t rue, thì s tatements2
được thực thi và điều khiển được chuyển đến câu lệnh kết thúc. Nếu không
(else) câu lệnh3 được thực thi. Lưu ý rằng câu lệnh else không có điều kiện.
Các câu lệnh else và elsei f có thể tự xuất hiện sau câu lệnh if; chúng không
cần phải xuất hiện theo cặp, như được hiển thị trong cú pháp chung ở trên. Có
thể chấp nhận được nhiều câu lệnh elseif
Giả sử rằng chúng ta muốn viết một hàm tính cường độ trung bình của một
hình ảnh. Như đã giải thích trong Phần 2.8.3, mảng hai chiều f có thể được
chuyển đổi thành vectơ cột, v, bằng cách Jetting v = f (:). Do đó, chúng tôi
muốn hàm của chúng tôi có thể hoạt động với cả đầu vào vector và hình ảnh.
Chương trình sẽ tạo ra lỗi nếu đầu vào không phải là mảng một hoặc hai chiều.

Lưu ý rằng đầu vào được chuyển đổi thành mảng 1-D bằng cách sử dụng A (:).
Nói chung, length (A) trả về kích thước của chiều dài nhất của một mảng, A.
Trong ví dụ này, vì A (:) là một vectơ, nên length (A) cho số phần tử là A.
Điều này loại bỏ sự cần thiết kiểm tra riêng để xác định xem đầu vào là vectơ
hay mảng 2-D. Một cách khác để lấy trực tiếp số phần tử trong mảng là sử
dụng hàm numel, có cú pháp là
n = numel (A)
Do đó, nếu A là một hình ảnh, numel (A) cho biết số pixel của nó. Sử dụng
chức năng này, dòng cuối cùng của chương trình trước đó trở thành
av = sum(A( :)} / numel (A) ;
Cuối cùng, hãy lưu ý rằng hàm lỗi chấm dứt thực thi chương trình và xuất ra
thông báo nằm trong dấu ngoặc đơn (bắt buộc phải có dấu ngoặc kép).
For
Vòng lặp for thực hiện một nhóm câu lệnh với số lần xác định. Cú pháp là
for index = start :increment:end
statements
end
Có thể lồng hai hoặc nhiều vòng lặp for, như sau:

Ví dụ: vòng lặp sau thực hiện 11 lần

Nếu số gia vòng lặp bị bỏ qua, nó được coi là 1. Số gia tăng vòng lặp cũng có
thể là số âm, như trong k = O: -1: -1 O. Lưu ý rằng không cần dấu chấm phẩy
ở cuối dòng for. MATLAB tự động ngăn việc in các giá trị của chỉ mục vòng
lặp. Như đã thảo luận chi tiết trong Phần 2.10.5, đôi khi có thể đạt được sự cải
thiện về tốc độ thực thi chương trình bằng cách thay thế vòng lặp for bằng mã
vectơ hóa gọi là bất cứ khi nào có thể.
Ví dụ 2.2 so sánh một số hình ảnh sử dụng các giá trị chất lượng JPEG khác
nhau. Ở đây, chúng tôi hướng dẫn cách ghi các tệp đó vào đĩa bằng vòng lặp
for. Giả sử rằng chúng ta có một hình ảnh, f, và chúng ta muốn ghi nó vào một
loạt các tệp JPEG với hệ số chất lượng từ 0 đến 100 với gia số là 5. Hơn nữa,
giả sử rằng chúng ta muốn ghi các tệp JPEG với tên tệp của biểu mẫu
loạt_xxx. j pg, trong đó xxx là yếu tố chất lượng. Chúng ta có thể thực hiện
điều này bằng cách sử dụng vòng lặp for sau:
Hàm sprintf, có cú pháp trong trường hợp này là
s = sprintf ( ' characters1 %ndcharacters2 ' , q)
ghi dữ liệu được định dạng dưới dạng chuỗi, s. Trong dạng cú pháp này, ký
tự1 và ký tự2 là các chuỗi ký tự và% nd biểu thị một số thập phân (được chỉ
định bởi q) với n chữ số. Trong ví dụ này, đặc điểm ers1 là series_, giá trị của
n là 3, đặc điểm ers2 là. j pg và q có các giá trị được chỉ định trong vòng lặp.
while
Một vòng lặp wh ile thực thi một nhóm câu lệnh miễn là biểu thức điều khiển
vòng lặp là t rue. Cú pháp là
while expression
statements
end
Như với câu lệnh if, các toán tử logic AND và OR xuất hiện bên trong biểu
thức phải là các toán tử logic vô hướng && và 1 1 · Như trong trường hợp
vòng lặp for, while có thể được lồng vào nhau:

Ví dụ: các vòng lặp while lồng nhau sau đây kết thúc khi cả a và b đều được
giảm xuống 0:
Lưu ý rằng để kiểm soát các vòng lặp, chúng tôi đã sử dụng quy ước của
MATLAB về việc coi một giá trị số trong ngữ cảnh logic là t rue khi nó khác
không và sai khi nó bằng 0. Nói cách khác, while a và while b đánh giá thành t
rue miễn là a và b là khác không. Như trong trường hợp của vòng lặp for, đôi
khi có thể đạt được tốc độ thực thi chương trình bằng cách thay thế vòng lặp
while bằng mã vector hóa (Phần 2.10.5).
Break
Như tên của nó, break chấm dứt việc thực thi một vòng lặp for hoặc while. Khi
gặp câu lệnh break, việc thực thi tiếp tục với câu lệnh tiếp theo bên ngoài vòng
lặp. Trong các vòng lặp lồng nhau, ngắt chỉ thoát ra khỏi vòng lặp trong cùng
chứa nó.
Continue
Câu lệnh continue chuyển quyền điều khiển cho lần lặp tiếp theo của vòng lặp
for hoặc while mà nó xuất hiện, bỏ qua mọi câu lệnh còn lại trong phần nội
dung của vòng lặp. Trong các vòng lặp lồng nhau, cont inue chuyển quyền
điều khiển cho lần lặp tiếp theo của vòng lặp trong cùng bao quanh nó.
Switch
Đây là tuyên bố lựa chọn để kiểm soát luồng của một hàm M dựa trên các loại
đầu vào khác nhau. Cú pháp là

Hàm swit ch thực thi các nhóm câu lệnh dựa trên giá trị của một biến hoặc
biểu thức. Các từ khóa viết hoa và phân biệt các nhóm. Chỉ trường hợp khớp
đầu tiên được thực hiện. T Luôn phải có một kết thúc để khớp với câu lệnh
switch. Dấu ngoặc nhọn được sử dụng khi nhiều biểu thức được đưa vào cùng
một câu lệnh trường hợp. Ví dụ, giả sử rằng một hàm M chấp nhận một ảnh f
và chuyển nó thành một lớp xác định, hãy gọi nó là lớp mới. Chỉ có ba lớp
hình ảnh được chấp nhận cho việc chuyển đổi: uint8, uint16 và double. Đoạn
mã sau thực hiện chuyển đổi mong muốn và xuất ra lỗi nếu lớp của hình ảnh
đầu vào không phải là một trong các lớp được chấp nhận:

Trong ví dụ này, chúng tôi viết một hàm M (dựa trên vòng lặp for) để trích
xuất một hình ảnh con hình chữ nhật từ một hình ảnh. Mặc dù chúng ta có thể
thực hiện việc trích xuất bằng một câu lệnh MATLAB (thực hiện nó như một
bài tập sau khi bạn đọc về mã vector hóa trong Phần 2.10.5), mục tiêu ở đây là
minh họa cho các vòng lặp. Các đầu vào cho hàm là hình ảnh, kích thước (số
hàng và cột) của hình ảnh con mà chúng ta muốn trích xuất và tọa độ của góc
trên cùng, bên trái của hình ảnh con. Hãy nhớ rằng nguồn gốc hình ảnh trong
MATLAB là tại (1, 1), như đã thảo luận trong Phần 2.1 .1.

Như một bài tập, bạn nên triển khai chương trình trước bằng cách sử dụng
vòng lặp while, thay vì for,.
2.10.4Xử lý chức năng
hàm xử lý là một kiểu dữ liệu MATLAB chứa thông tin được sử dụng để tham
chiếu một hàm. Một trong những lợi thế chính của việc sử dụng các hàm xử lý
là bạn có thể chuyển một hàm xử lý làm đối số trong một lệnh gọi đến một
hàm khác. Như bạn sẽ thấy trong phần tiếp theo, việc xử lý hàm mang tất cả
thông tin cần thiết cho MATLAB để đánh giá hàm có thể dẫn đến việc triển
khai chương trình đơn giản hơn. Các chốt chức năng cũng có thể cải thiện hiệu
suất trong các hoạt động lặp lại và ngoài việc được chuyển cho các hàm khác,
chúng có thể được lưu trong cấu trúc dữ liệu hoặc tệp để sử dụng sau này.
Có hai loại xử lý chức năng khác nhau, cả hai đều được tạo bằng cách sử dụng
toán tử xử lý chức năng, @. Loại tay cầm chức năng đầu tiên là tay cầm chức
năng. Được đặt tên (còn được gọi là đơn giản). Để tạo một hàm điều khiển
được đặt tên, hãy làm theo toán tử @ với tên của hàm mong muốn. Ví dụ:

Hàm sin có thể được gọi gián tiếp bằng cách gọi hàm xử lý, f:

Loại xử lý hàm thứ hai là xử lý hàm ẩn danh, được hình thành từ biểu thức
MATLAB thay vì tên hàm. Định dạng chung để xây dựng một hàm ẩn danh là:
@ ( input -argument - list ) expression
Ví dụ: hàm ẩn danh sau xử lý bình phương đầu vào của nó:
>> g = @(x) x.^2;
và xử lý sau đây tính căn bậc hai của tổng của hai biến bình phương:\
>> r = @(x, y)sqrt (x.^2 + y.^2);
Các điều khiển hàm ẩn danh có thể được gọi giống như các điều khiển chức
năng đã đặt tên:
Nhiều hàm MATLAB và Hộp công cụ xử lý ảnh lấy các chốt chức năng làm
đối số đầu vào. Ví dụ, hàm quad thực hiện tích phân số. Hàm được tích hợp
được chỉ định bằng cách chuyển một hàm điều khiển làm đối số đầu vào cho
quad. Ví dụ: câu lệnh sau đây tính tích phân xác định của hàm sin trong
khoảng [0, pi / 4] (nhớ lại từ thảo luận ở trên rằng f = @sin):

trong đó f được xác định ở trên. Các xử lý chức năng ẩn danh có thể được
chuyển cho các chức năng khác theo cách chính xác. Câu lệnh sau đây tính
tích phân xác định của x2 trong khoảng [0, 1]:

trong đó g được định nghĩa ở trên. Chúng tôi đưa ra các ví dụ bổ sung về các
hàm xử lý trong phần sau và trong các chương sau.
2.10.5Tối ưu hóa mã
Như đã thảo luận chi tiết trong Phần 1 .3, MATLAB là một ngôn ngữ lập trình
được thiết kế đặc biệt cho các hoạt động mảng. Tận dụng thực tế này bất cứ
khi nào có thể có thể dẫn đến sự gia tăng đáng kể tốc độ tính toán. Trong phần
này, chúng ta thảo luận về hai cách tiếp cận quan trọng để tối ưu hóa mã
MATLAB: định vị trước các mảng và vòng lặp vector hóa.
Định vị trước Mảng
Định vị trước đề cập đến việc khởi tạo mảng trước khi nhập vòng lặp for tính
toán các phần tử của mảng. Để minh họa tại sao việc phân bổ trước có thể
quan trọng, chúng ta bắt đầu với một thí nghiệm đơn giản. Giả sử rằng chúng
ta muốn tạo một hàm MATLAB tính toán
f(x) = sin(x/100π)
cho x = 0, 1, 2 ,. . . , M - 1. Đây là phiên bản đầu tiên của hàm:

Các hàm tic và toe của MATLAB có thể được sử dụng để đo thời gian một
hàm cần thực thi. Chúng tôi gọi tic, sau đó gọi hàm, và sau đó gọi toc:

(Nếu bạn nhập ba câu lệnh trước đó vào các dòng riêng biệt, thời gian đo được
sẽ bao gồm thời gian cần thiết để bạn nhập hai dòng thứ hai.)
Các hàm định thời sử dụng các cuộc gọi như trong đoạn trước có thể tạo ra các
biến thể lớn trong thời gian đo được, đặc biệt khi được thực hiện tại dấu nhắc
lệnh. Ví dụ: lặp lại cuộc gọi trước đó sẽ cho một kết quả khác:
>> tic ; sinfun1 (100 ) ; toe
Elapsed time is 0.001 1 97 second
hàm timeit có thể được sử dụng để lấy các phép đo thời gian lặp lại, đáng tin
cậy của các lệnh gọi hàm. Cú pháp gọi cho thời gian đó là
s = timeit (f)
trong đó f là một hàm điều khiển để hàm được hẹn giờ, và s là thời gian đo
được, tính bằng giây, được yêu cầu để gọi f. Hàm xử lý f được gọi mà không
có đối số đầu vào. Chúng ta có thể sử dụng timeit như sau để tính thời gian
sinfun1 cho M = 100:
Lệnh gọi đến thời gian hàm này là một minh họa tuyệt vời về sức mạnh của
khái niệm xử lý hàm đã được giới thiệu trong phần trước. Bởi vì nó chấp nhận
một hàm xử lý không có đầu vào, hàm timei t độc lập với các tham số của hàm
mà chúng ta muốn định thời gian. Thay vào đó, chúng tôi ủy thác nhiệm vụ đó
cho việc tạo ra chính hàm xử lý. Trong trường hợp này, chỉ một tham số, M, là
cần thiết. Nhưng bạn có thể hình dung các hàm phức tạp hơn với nhiều tham
số. Bởi vì một bộ xử lý hàm lưu trữ tất cả thông tin cần thiết để đánh giá hàm
mà nó được xác định, nên có thể thời gian yêu cầu một đầu vào duy nhất
nhưng vẫn có khả năng định thời cho bất kỳ hàm nào, độc lập với độ phức tạp
hoặc số lượng tham số của nó. Đây là một tính năng lập trình rất hữu ích
Tiếp tục với thí nghiệm của mình, chúng tôi sử dụng thời gian để đo thời gian
sinfun1 mất cho M = 500, 1 000, 1 500, ..., 20000:

Mặc dù chúng ta có thể mong đợi thời gian cần thiết để tính toán sinfun1 (M)
tỷ lệ với M, Hình 2.8 (a) cho thấy rằng thời gian cần thiết thực sự tăng lên như
một hàm của MA2. Lý do là ở sinfun1. m biến đầu ra y tăng kích thước một
phần tử mỗi lần qua vòng lặp. MATLAB có thể tự động xử lý sự tăng trưởng
mảng ngầm định này, nhưng nó phải phân bổ lại không gian bộ nhớ mới và
sao chép các phần tử mảng trước đó mỗi khi mảng phát triển. Việc sao chép và
tái phân bổ bộ nhớ thường xuyên này rất tốn kém, đòi hỏi nhiều thời gian hơn
so với tính toán sin.
Giải pháp cho vấn đề hiệu suất này được đề xuất bởi MATLAB Editor, báo
cáo cho sinfun1 .m rằng:
'y' might be g rowing inside a loop . Consider preallocating for speed .
Định vị trước y có nghĩa là khởi tạo nó với kích thước đầu ra mong đợi trước
khi bắt đầu vòng lặp. Thông thường, việc phân bổ trước được thực hiện bằng
cách gọi hàm số không (xem Phần 2.9). Phiên bản thứ hai của hàm, sinfun2.
m, sử dụng phân bổ trước:

So sánh thời gian cần thiết cho sinfun1 (20000) và sinfun2 (20000):

Phiên bản sử dụng phân bổ trước chạy nhanh hơn khoảng 220 lần. Hình 2.8 (b)
cho thấy thời gian cần thiết để chạy s infun2 tỷ lệ với M. [Lưu ý rằng thang
thời gian khác nhau đối với các Hình. 2,8 (a) và (b).]
Vectorizing Loops
Vectơ hóa trong MATLAB đề cập đến các kỹ thuật loại bỏ hoàn toàn các vòng
lặp, sử dụng kết hợp các toán tử ma trận / vectơ, kỹ thuật lập chỉ mục và các
hàm MATLAB hoặc hộp công cụ hiện có. Để làm ví dụ, chúng ta xem lại các
hàm sin fun đã thảo luận trong phần trước. Phiên bản sinfun thứ ba của chúng
tôi khai thác thực tế rằng sin có thể hoạt động theo từng phần tử trên đầu vào
mảng, không chỉ trên đầu vào vô hướng. Hàm sinfun3 không có vòng lặp for:

Trong các phiên bản cũ hơn của MATLAB, việc loại bỏ các vòng lặp bằng
cách sử dụng các toán tử vectơ và ma trận hầu như luôn dẫn đến việc tăng tốc
độ đáng kể. Tuy nhiên, các phiên bản gần đây của MATLAB có thể tự động
biên dịch các vòng lặp for đơn giản, chẳng hạn như vòng lặp trong s infun2,
thành mã máy nhanh. Do đó, nhiều vòng lặp for chậm trong các phiên bản
MATLAB cũ hơn không còn chậm hơn các phiên bản được vector hóa. Trên
thực tế, chúng ta có thể thấy rằng sinf un3, không có vòng lặp, chạy ở cùng tốc
độ với sinfun2, có một vòng lặp:

Như ví dụ sau cho thấy, vẫn có thể tăng tốc độ bằng cách sử dụng vectơ hóa,
nhưng mức tăng không quá ấn tượng như trước đây trong các phiên bản trước
của MATLAB.
Trong ví dụ này, chúng tôi viết hai phiên bản của một hàm MATLAB tạo ra
một hình ảnh tổng hợp dựa trên phương trình:
f(x, y) = A sin(u0x + v0y)
Hàm đầu tiên, twodsin 1, sử dụng hai vòng lặp for lồng nhau để tính f:
Quan sát bước định vị trước, f = số không (M, N), trước các vòng lặp for.
Chúng tôi sử dụng timeit để xem hàm này mất bao lâu để tạo một hình ảnh
hình sin có kích thước 512 x 512 pixel:

Nếu không phân bổ trước, hàm này sẽ chạy chậm hơn khoảng 42 lần, mất 1 .
9826 giây để thực thi với cùng các tham số đầu vào.
Chúng tôi có thể hiển thị hình ảnh kết quả bằng cách sử dụng cú pháp phạm vi
tự động ([ ]) của imshow:
>> f = twodsin 1 ( 1 , 1 / ( 4*pi) , 1 / ( 4*pi) , 512, 512 ) ;
>> imshow(f , [ ])
Hình 2.9 cho thấy kết quả.
Trong phiên bản thứ hai của hàm, chúng tôi vectơ hóa nó (nghĩa là chúng tôi
viết lại nó mà không sử dụng vòng lặp for) bằng cách sử dụng một hàm
MATLAB rất hữu ích được gọi là meshgrid, với các lệnh cú pháp sử dụng
meshgrid để đánh giá hàm z = x + y cho số nguyên các giá trị của x nằm trong
khoảng từ 1 đến 3 và các giá trị nguyên của y nằm trong khoảng từ 10 đến 14:
Cuối cùng, chúng tôi sử dụng meshgrid để viết lại hàm sin 2-D mà không có
vòng lặp

Như trước đây, chúng tôi sử dụng thời gian để đo tốc độ của nó:

Phiên bản vector hóa mất ít thời gian hơn 50% để chạy.
Vì mỗi bản phát hành mới của MATLAB có xu hướng cải thiện khả năng chạy
các vòng lặp nhanh hơn, nên rất khó để đưa ra các hướng dẫn chung về thời
điểm vectơ hóa mã MATLAB. Đối với nhiều người dùng được đào tạo về toán
học, những người đã quen thuộc với ma trận và ký hiệu vectơ, mã được vector
hóa thường dễ đọc hơn (trông giống 11 11 hơn) so với mã dựa trên các vòng
lặp. Ví dụ: so sánh dòng này từ hàm twodsin2:
f = A*sin ( u0*R + v0*C ) ;
với những dòng này từ twodsin1 để thực hiện cùng một thao tác:

Rõ ràng công thức đầu tiên ngắn gọn hơn, nhưng cơ chế của những gì thực sự
đang diễn ra rõ ràng hơn trong công thức thứ hai.
Trước tiên, người ta nên cố gắng viết mã chính xác và dễ hiểu. Sau đó, nếu mã
không chạy đủ nhanh, hãy sử dụng MATLAB Profiler (xem Phần 1.7.l) để xác
định các điểm có thể xảy ra sự cố về hiệu suất. Nếu bất kỳ điểm nào trong số
những điểm rắc rối này là đối với các vòng lặp, hãy đảm bảo rằng không có
vấn đề về phân bổ trước và sau đó xem xét sử dụng kỹ thuật vectơ hóa. Tài
liệu MATLAB chứa hướng dẫn thêm về hiệu suất; tìm kiếm tài liệu cho phần
có tiêu đề "Kỹ thuật Cải thiện Hiệu suất".
2.10.6Tương tác I/O
Trong phần này, chúng tôi thiết lập nền tảng để viết các hàm M tương tác hiển
thị thông tin và hướng dẫn cho người dùng và chấp nhận đầu vào từ bàn phím.
Hàm disp được sử dụng để hiển thị thông tin trên màn hình. Cú pháp của nó là
disp ( argument )
Nếu đối số là một mảng, thì disp sẽ hiển thị nội dung của nó. Nếu một rgument
là một chuỗi văn bản, thì disp sẽ hiển thị các ký tự trong chuỗi. Ví dụ,

Digital Image Processing .


>> disp ( ' This is another way to display text . ')
Đây là một cách khác để hiển thị văn bản.
Lưu ý rằng chỉ nội dung của đối số được hiển thị, không có các từ như ans =,
mà chúng ta thường thấy trên màn hình khi giá trị của một biến được hiển thị
bằng cách bỏ qua dấu chấm phẩy ở cuối dòng lệnh.
Đầu vào hàm được sử dụng để nhập dữ liệu vào M-function. Cơ bản cú pháp

t = input ( ' message ')
Hàm này xuất ra các từ có trong tin nhắn và đợi người dùng nhập vào, theo sau
là Return (Enter), và lưu dữ liệu vào trong t. Đầu vào có thể là một số, một
chuỗi ký tự (được bao bởi dấu ngoặc đơn), vectơ (được bao bởi dấu ngoặc
vuông và các phần tử được phân tách bằng dấu cách hoặc dấu phẩy), ma trận
(được bao bởi dấu ngoặc vuông và các hàng được phân tách bằng dấu chấm
phẩy) hoặc bất kỳ cấu trúc dữ liệu MATLAB hợp lệ khác. Ví dụ,
>> t = input ( ' Enter you r data : ')
Enter your data: 25
Nếu các mục nhập là hỗn hợp các ký tự và số, thì chúng ta sử dụng một trong
các hàm xử lý chuỗi của MATLAB. Mối quan tâm đặc biệt trong cuộc thảo
luận hiện tại là hàm strread, có cú pháp
[a, b, c, : .. ] = strread ( cst r, ' format ', ' param ' , ' value ')
Hàm này đọc dữ liệu từ chuỗi ký tự estr, sử dụng định dạng được chỉ định và
kết hợp param / giá trị. Trong chương này, các định dạng được quan tâm là% f
và% q, để biểu thị số dấu phẩy động và chuỗi ký tự, tương ứng. Đối với tham
số, chúng tôi sử dụng dấu phân cách để biểu thị rằng các thực thể được xác
định trong định dạng sẽ được phân cách bằng một ký tự được chỉ định trong
giá trị (thường là dấu phẩy hoặc dấu cách). Ví dụ: giả sử rằng chúng ta có
chuỗi
>> t = ' 1 2.6, x2y , z ' ;
Để đọc các phần tử của đầu vào này thành ba biến a, b và c, chúng ta viết
Đầu ra a thuộc loại kép. Các dấu ngoặc kép xung quanh đầu ra x2y và z chỉ ra
rằng b và c là các mảng ô, sẽ được thảo luận trong phần tiếp theo. Chúng tôi
chuyển đổi chúng thành mảng ký tự đơn giản bằng cách

và tương tự đối với c. Số lượng (và thứ tự) của các phần tử trong chuỗi định
dạng phải khớp với số lượng và loại biến đầu ra dự kiến ở bên trái. Trong
trường hợp này, chúng tôi mong đợi ba đầu vào: một số dấu phẩy động theo
sau là hai chuỗi ký tự.
Hàm strcmp được sử dụng để so sánh các chuỗi. Ví dụ, giả sử rằng chúng ta
muốn viết một hàm M, g = imnorm (f, param), chấp nhận một hình ảnh, f và
một tham số pa ram hơn có thể có một trong hai dạng: 'norm1' và 'norm255' .
Trong trường hợp đầu tiên, f được chia tỷ lệ thành phạm vi [O, 1]; trong thứ
hai, nó sẽ được chia tỷ lệ thành phạm vi [O, 255]. Đầu ra phải thuộc loại kép
trong cả hai trường hợp. Đoạn mã sau hoàn thành quá trình chuẩn hóa bắt
buộc:

Lỗi sẽ xảy ra nếu giá trị được chỉ định trong pa ram không phải là 'norm1'
hoặc 'norm255'. Ngoài ra, sẽ xảy ra lỗi nếu không phải tất cả các ký tự chữ
thường được sử dụng cho một trong hai hệ số chuẩn hóa. Chúng ta có thể sửa
đổi hàm để chấp nhận các ký tự viết thường hoặc viết hoa bằng cách sử dụng
hàm strcmpi, hàm này thực hiện so sánh chuỗi phân biệt chữ hoa chữ thường.
2.10.7Giới thiệu về Mảng và Cấu trúc Ô
Chúng tôi kết thúc chương này với một cuộc thảo luận về các mảng và cấu
trúc ô. Như bạn sẽ thấy trong các chương tiếp theo, được sử dụng rộng rãi
trong lập trình M-function.
Cell arrays
Mảng ô cung cấp một cách để kết hợp một tập hợp hỗn hợp các đối tượng (ví
dụ: số, ký tự, ma trận, các mảng ô khác) dưới một tên biến. Ví dụ, giả sử rằng
chúng ta đang làm việc với (1) hình ảnh uint8, f, có kích thước 5 12 X 512
pixel; (2) dãy tọa độ 2-D dưới dạng các hàng của mảng 1 88 X 2, b; và (3) một
mảng ô chứa hai tên ký tự, char _a rray = {'area', 'cent roid'} (dấu ngoặc nhọn
được sử dụng để bao quanh nội dung của một mảng ô). Ba thực thể khác nhau
này có thể được tổ chức thành một biến duy nhất, C, bằng cách sử dụng các
mảng ô:
C = {f, b, char_array}
Gõ C tại dấu nhắc sẽ xuất ra các kết quả sau:

Nói cách khác, kết quả đầu ra được hiển thị không phải là giá trị của các biến
khác nhau, mà là mô tả về một số thuộc tính của chúng. Để xem toàn bộ nội
dung của một phần tử của ô, chúng tôi đặt vị trí số của phần tử đó trong dấu
ngoặc nhọn. Ví dụ, để xem nội dung của char _array, chúng ta nhập

hoặc chúng ta có thể sử dụng hàm celldisp:


Sử dụng dấu ngoặc đơn thay vì dấu ngoặc nhọn trên một phần tử của C đưa ra
mô tả về biến:

Chúng ta có thể làm việc với nội dung cụ thể của một mảng ô bằng cách
chuyển chúng sang dạng số hoặc dạng mảng thích hợp khác. Ví dụ, để trích
xuất f từ C, chúng tôi sử dụng
>> f = C{ 1};
Kích thước hàm cung cấp kích thước của một mảng ô:

Chức năng ô vui nhộn, với cú pháp


D = cellfun ( ' f name ' , C)
áp dụng hàm fname cho các phần tử của mảng ô C và trả về kết quả trong
mảng kép D. Mỗi phần tử của D chứa giá trị được trả về bởi fname cho phần
tử tương ứng trong C. Mảng đầu ra D có cùng kích thước với mảng ô C. Ví dụ,

Nói cách khác, length (f) = 512, length (b) = 1 88 và length (char _array) = 2.
Nhớ lại phần 2.1 0.3 rằng độ dài (A) cho kích thước của kích thước dài nhất
của mảng A nhiều chiều
Cuối cùng, chúng tôi chỉ ra rằng mảng ô chứa bản sao của các đối số, không
phải con trỏ đến các đối số đó. Do đó, nếu bất kỳ đối số nào của C trong ví dụ
trước thay đổi sau khi C được tạo, thì thay đổi đó sẽ không được phản ánh
trong C.
Giả sử rằng chúng ta muốn viết một hàm xuất ra cường độ trung bình của một
hình ảnh, kích thước của nó, cường độ trung bình của các hàng và cường độ
trung bình của các cột. Chúng ta có thể làm điều đó theo cách "chuẩn" bằng
cách viết một hàm của biểu mẫu

trong đó f là ảnh đầu vào và các biến đầu ra tương ứng với các đại lượng vừa
nêu. Sử dụng mảng ô, chúng tôi sẽ viết

Viết G (1) = {size (f)}, và tương tự cho các thuật ngữ khác, cũng được chấp
nhận. Mảng ô có thể đa chiều. Ví dụ, hàm trước đó cũng có thể được viết dưới
dạng

Hoặc, chúng ta có thể sử dụng H {1, 1} = s ize (f), v.v. cho các biến khác.
Các kích thước bổ sung được xử lý theo cách tương tự. Giả sử rằng f có kích
thước 512 x 512. Nhập G và H vào dấu nhắc sẽ cho
Nếu chúng ta muốn làm việc với bất kỳ biến nào có trong G, chúng ta trích
xuất nó bằng cách giải quyết một phần tử cụ thể của mảng ô, như trước đây.
Ví dụ, nếu chúng ta muốn làm việc với kích thước f, chúng ta viết
>> v = G{1}
Or
>> v = H{1 ,1}
trong đó v là vectơ 1x2. Lưu ý rằng chúng tôi không sử dụng lệnh quen thuộc
[M, N] = G {1} để lấy kích thước của hình ảnh. Điều này sẽ gây ra lỗi vì chỉ các
hàm mới có thể tạo ra nhiều đầu ra. Để thu được M và N, chúng ta sẽ sử dụng M =
v (1) và N = v (2).
Nền kinh tế của ký hiệu hiển nhiên trong ví dụ trước càng trở nên rõ ràng hơn khi
số lượng đầu ra lớn. Một hạn chế là sự mất rõ ràng trong việc sử dụng địa chỉ số,
trái ngược với việc gán tên cho các đầu ra. Sử dụng cấu trúc giúp ích trong vấn đề
này.
Structures
Các cấu trúc tương tự như mảng ô ở chỗ chúng cho phép nhóm một tập hợp các dữ
liệu khác nhau thành một biến duy nhất. Tuy nhiên, không giống như mảng ô,
trong đó các ô được đánh địa chỉ bằng số, các phần tử của cấu trúc được đánh địa
chỉ bằng tên do người dùng xác định được gọi là trường
Tiếp tục với chủ đề của Ví dụ 2.14 sẽ làm rõ những khái niệm này. VÍ DỤ 2.15: Sử
dụng cấu trúc, chúng ta viết

trong đó s là một cấu trúc. Các trường của cấu trúc trong trường hợp này là dm
(vectơ a1X2), AI (vô hướng), hàng AI (vectơ M x 1) và AI cols (vectơ 1 x N),
trong đó M và N là số hàng và cột của hình ảnh. Lưu ý việc sử dụng dấu chấm để
tách cấu trúc khỏi các trường khác nhau của nó. Tên trường là tùy ý, nhưng chúng
phải bắt đầu bằng ký tự không phải số.
Sử dụng hình ảnh tương tự như trong Ví dụ 2. 14 và nhập s và (các) kích thước tại
dấu nhắc sẽ cho kết quả sau:

Lưu ý rằng bản thân s là một đại lượng vô hướng, với bốn trường được liên kết với
nó trong trường hợp này.
Trong ví dụ này, chúng ta thấy rằng logic của mã vẫn giống như trước, nhưng việc
tổ chức dữ liệu đầu ra rõ ràng hơn nhiều. Như trong trường hợp của mảng ô, lợi thế
của việc sử dụng các cấu trúc sẽ trở nên rõ ràng hơn nếu chúng ta xử lý số lượng
đầu ra lớn hơn.
Hình minh họa trước đã sử dụng một cấu trúc duy nhất. Nếu, thay vì một hình ảnh,
chúng tôi có Q hình ảnh được tổ chức dưới dạng một mảng M X N X Q, hàm sẽ trở
thành
Nói cách khác, bản thân các cấu trúc có thể được lập chỉ mục. Mặc dù, như với
mảng ô, cấu trúc có thể có bất kỳ số kích thước nào, dạng phổ biến nhất của chúng
là vectơ, như trong hàm trước.
Việc trích xuất dữ liệu từ một trường yêu cầu phải ghi nhớ kích thước của cả s và
trường. Ví dụ: câu lệnh sau trích xuất tất cả giá trị của các hàng AI và lưu trữ
chúng trong v:

Lưu ý rằng dấu hai chấm ở chiều thứ nhất của v và k ở chiều thứ hai vì có chiều 1
XQ và hàng AI có chiều M x 1. Do đó, vì k đi từ 1 đến Q nên v có chiều MX Q
Nếu chúng ta quan tâm đến việc trích xuất các giá trị của AI cols, chúng ta sẽ sử
dụng v (k,:) trong vòng lặp.
Dấu ngoặc vuông có thể được sử dụng để trích xuất thông tin thành một vectơ hoặc
ma trận nếu trường của một cấu trúc chứa các đại lượng vô hướng. Ví dụ, giả sử
rằng D. Area chứa diện tích của mỗi vùng trong số 20 vùng trong một hình ảnh.
Viết
>> w = [D.Area ] ;
tạo một vectơ 1 x 20 w trong đó mỗi phần tử là diện tích của một trong các vùng.
Như với mảng ô, khi một giá trị được gán cho một trường cấu trúc, MATLAB sẽ
tạo một bản sao của giá trị đó trong cấu trúc. Nếu giá trị ban đầu được thay đổi sau
đó, sự thay đổi đó không được phản ánh trong cấu trúc.
Summary
Tài liệu trong chương này là nền tảng cho các cuộc thảo luận tiếp theo. Tại thời
điểm này, bạn sẽ có thể lấy một hình ảnh từ đĩa, xử lý nó bằng các thao tác đơn
giản, hiển thị kết quả và lưu nó vào đĩa. Điều quan trọng cần lưu ý là bài học quan
trọng của chương này là cách kết hợp các chức năng MATLAB và Hộp công cụ xử
lý hình ảnh với các cấu trúc lập trình để tạo ra các giải pháp mở rộng khả năng của
các chức năng đó. Trên thực tế, đây là mô hình của cách vật liệu được trình bày
trong các chương sau. Bằng cách kết hợp các chức năng tiêu chuẩn với mã mới,
chúng tôi hiển thị các giải pháp nguyên mẫu cho một loạt các vấn đề quan tâm
trong xử lý hình ảnh kỹ thuật số.
Chương 3: Biến đổi cường độ và lọc không gian
Preview
Thuật ngữ miền không gian đề cập đến chính mặt phẳng hình ảnh và các phương
pháp trong danh mục này dựa trên thao tác trực tiếp của các pixel trong hình ảnh.
Trong chương này, chúng ta tập trung chú ý vào hai phạm trù quan trọng của xử lý
miền không gian: biến đổi cường độ (mức xám) và lọc không gian. Cách tiếp cận
thứ hai đôi khi được gọi là xử lý vùng lân cận, hoặc tích chập không gian. Trong
các phần sau, chúng tôi phát triển và minh họa các công thức MATLAB đại diện
cho các kỹ thuật xử lý trong hai loại này. Chúng tôi cũng giới thiệu khái niệm xử lý
ảnh mờ và phát triển một số hàm M mới để triển khai chúng. Để mang một chủ đề
nhất quán, hầu hết các ví dụ trong chương này đều liên quan đến việc nâng cao
hình ảnh. Đây là một cách tốt để giới thiệu xử lý không gian vì tính năng nâng cao
có tính trực quan và hấp dẫn cao, đặc biệt là đối với người mới bắt đầu trong lĩnh
vực này. Tuy nhiên, như bạn sẽ thấy trong suốt cuốn sách, các kỹ thuật này có
phạm vi chung và được sử dụng trong nhiều nhánh khác của xử lý hình ảnh kỹ
thuật số
3.1 Background
Như đã lưu ý trong đoạn trước, các kỹ thuật miền không gian hoạt động trực tiếp
trên các pixel của hình ảnh. Các quá trình trong miền không gian được thảo luận
trong chương này được biểu thị bằng biểu thức
g(x, y) = T [f(x, y)]
trong đó f (x, y) là hình ảnh đầu vào, g (x, y) là hình ảnh đầu ra (processe.d) và T là
một toán tử trên f được xác định trên một vùng lân cận xác định về điểm (x, y).
Ngoài ra, T có thể hoạt động trên một tập hợp các hình ảnh, chẳng hạn như thực
hiện thêm các hình ảnh K để giảm nhiễu.
Cách tiếp cận chính để xác định các vùng lân cận không gian về một điểm (x, y) là
sử dụng một vùng hình vuông hoặc hình chữ nhật có tâm tại (x, y), như trong Hình
3.1. Trung tâm của vùng được di chuyển từ pixel này sang pixel khác, bắt đầu,
chẳng hạn như ở trên cùng, góc trái và khi di chuyển, nó bao gồm các vùng lân cận
khác nhau. Toán tử T được áp dụng tại mỗi vị trí (x, y) để mang lại kết quả đầu ra,
g, tại vị trí đó. Chỉ các pixel trong vùng lân cận có tâm tại (x, y) được sử dụng để
tính giá trị của g tại (x, y).
Phần lớn phần còn lại của chương này đề cập đến các cách triển khai khác nhau
của phương trình trước. Mặc dù phương trình này đơn giản về mặt khái niệm,
nhưng việc triển khai tính toán của nó trong MATLAB yêu cầu phải chú ý cẩn thận
đến các lớp dữ liệu và phạm vi giá trị
3.2 Các chức năng chuyển đổi cường độ
Dạng đơn giản nhất của phép biến đổi T là khi vùng lân cận trong Hình 3.1 có kích
thước 1 X 1 (một pixel đơn). Trong trường hợp này, giá trị của g tại (x, y) chỉ phụ
thuộc vào cường độ của f tại điểm đó, và T trở thành một hàm biến đổi cường độ
hoặc mức xám. Hai thuật ngữ này được sử dụng thay thế cho nhau khi xử lý hình
ảnh đơn sắc (tức là tỷ lệ xám). Khi xử lý ảnh màu, thuật ngữ cường độ được sử
dụng để biểu thị một thành phần ảnh màu trong không gian màu nhất định, như
được mô tả trong Chương 7.
Bởi vì giá trị đầu ra chỉ phụ thuộc vào giá trị cường độ tại một điểm chứ không phụ
thuộc vào vùng lân cận của các điểm, các hàm biến đổi cường độ thường được viết
ở dạng đơn giản như
s = T(r)
trong đó r là cường độ của f và s là cường độ của g, cả hai đều ở cùng tọa độ (x, y)
trong ảnh.
3.2.1 Các chức năng imadj ust và stretchlim
Chức năng imadjust là chức năng Hộp công cụ xử lý hình ảnh cơ bản để biến đổi
cường độ của hình ảnh tỷ lệ xám. Nó có cú pháp chung
g = imadjust (f, [ low_in high_in ], [ low_out high_out ], gamma )
Như Hình 3.2 minh họa, hàm này ánh xạ các giá trị cường độ trong hình ảnh f
thành các giá trị mới trong g, sao cho các giá trị giữa low_in và high_in ánh xạ
thành các giá trị giữa low_out và high_out. Các giá trị dưới low_in và trên high_in
được cắt bớt; nghĩa là các giá trị bên dưới low_in ánh xạ thành low_out và các giá
trị trên high_in ánh xạ thành high_out. Hình ảnh đầu vào có thể thuộc lớp uint8,
uint16, int16, đơn hoặc kép và hình ảnh đầu ra có cùng lớp với đầu vào. Tất cả các
đầu vào cho hàm imadj ust, ngoài f và gamma, được chỉ định là các giá trị từ 0 đến
I, độc lập với lớp của f. Ví dụ, nếu f là của
class uint8, imadj ust nhân các giá trị được cung cấp với 255 để xác định · các giá
trị thực tế để sử dụng. Sử dụng ma trận trống ([J) cho [low_in high_in] hoặc cho
[low_out high_out] cho kết quả là các giá trị mặc định [0 1]. Nếu high_ out nhỏ
hơn low_ out, cường độ đầu ra bị đảo ngược.
Tham số gamma xác định hình dạng của đường cong ánh xạ các giá trị cường độ
trong f để tạo ra g. Nếu gamma là Jess lớn hơn 1, ánh xạ có trọng số đối với các giá
trị đầu ra cao hơn (sáng hơn), như trong Hình 3.2 (a). Nếu gamma lớn hơn I, ánh
xạ có trọng số đối với các giá trị đầu ra thấp hơn (tối hơn). Nếu nó bị bỏ qua khỏi
đối số hàm, gamma mặc định là 1 (ánh xạ tuyến tính).
Hình 3.3 (a) là hình ảnh chụp nhũ ảnh kỹ thuật số, f, cho thấy một tổn thương nhỏ
và Hình 3.3 (b) là hình ảnh âm tính, thu được bằng lệnh
>> g1 = imadjust(f, [O 1], [1 O ] );
Quá trình này, tương đương với kỹ thuật số để thu được âm bản trong ảnh, đặc biệt
hữu ích để tăng cường chi tiết màu trắng hoặc xám được nhúng trong một vùng
lớn, chủ yếu là tối. Ví dụ, lưu ý rằng việc phân tích mô vú trong Hình 3.3 (b) sẽ dễ
dàng hơn bao nhiêu. Âm bản của một hình ảnh cũng có thể được lấy bằng chức
năng hộp công cụ imcomplement:
g = imcomplement (f)
Hình 3.3 (c) là kết quả của việc sử dụng lệnh
>> g2 = imadjust(f, [0.5 0.75 ] , [0 1]);
mở rộng khoảng thang màu xám từ 0,5 đến 0,75 thành phạm vi [0, 1] đầy đủ. Loại
xử lý này rất hữu ích để làm nổi bật dải cường độ mà bạn quan tâm. Cuối cùng, sử
dụng lệnh
>> g3 = imadjust ( f , [ ] , [ ], 2 ) ;
tạo ra một kết quả tương tự như (nhưng với nhiều tông màu xám hơn) Hình 3.3 (c)
bằng cách nén phần cuối thấp và mở rộng phần cuối cao của thang màu xám [Hình.
3,3 (d)].
Đôi khi, điều quan tâm là có thể sử dụng hàm imadj ust "tự động", mà không cần
quan tâm đến các tham số thấp và cao đã thảo luận ở trên. Hàm st retchlim rất hữu
ích về mặt đó; cú pháp cơ bản của nó là
Low_High = stretch lim (f)
trong đó Low_High là một vectơ hai phần tử của giới hạn dưới và trên có thể được
sử dụng để đạt được độ giãn tương phản (xem phần sau để biết định nghĩa về thuật
ngữ này). Theo mặc định, các giá trị trong Low_High chỉ định các mức cường độ
bão hòa 1% dưới cùng và trên cùng của tất cả các giá trị pixel trong f. Kết quả
được sử dụng trong vector [low_in high_in] trong hàm imadjust, như sau:
>> g = imadjust(f, stretchlim(f) , [ ]);
Hình 3.3 (e) cho thấy kết quả của việc thực hiện thao tác này trên Hình 3.3 (a).
Quan sát sự gia tăng độ tương phản. Tương tự, Hình 3.3 (f) thu được bằng lệnh
>> g = imadjust(f, stretchlim ( f ) , (1 O ] );
Như bạn có thể thấy bằng cách so sánh các Hình. 3.3 (b) và (f), thao tác này nâng
cao độ tương phản của hình ảnh âm bản.
Cú pháp tổng quát hơn một chút cho Stretlim là
Low_High = stretch lim (f, tol )
trong đó tol là vectơ hai phần tử [low_frac high_frac] chỉ định phần hình ảnh bão
hòa ở các giá trị pixel thấp và cao.
điều chỉnh các phân số bằng nhau ở các giá trị pixel thấp và cao. Nếu bạn bỏ qua
nó khỏi đối số, tol sẽ mặc định là [0,01 0,99], cho mức bão hòa là 2%. nếu bạn
chọn tol = O, sau đó Low_High = [min (f (:)) max (f (:))].
3.2.2 Phép biến đổi logarit và giãn tương phản
Phép biến đổi lôgarit và kéo giãn độ tương phản là các công cụ cơ bản để thao tác
dải động. Phép biến đổi lôgarit được thực hiện bằng cách sử dụng biểu thức
g = c * log (1 + f)
trong đó c là hằng số và f là dấu phẩy động. Hình dạng của phép biến đổi này
tương tự như đường cong gamma trong Hình 3.2 (a) với các giá trị thấp được đặt là
0 và các giá trị cao được đặt thành 1 trên cả hai thang đo. Tuy nhiên, lưu ý rằng
hình dạng của đường cong gamma có thể thay đổi, trong khi hình dạng của hàm
log là cố định.
Một trong những ứng dụng chính của phép biến đổi nhật ký là nén dải động. Ví dụ,
không có gì lạ khi có phổ Fourier (Chương 4) với các giá trị trong khoảng [O, 1
06] hoặc cao hơn. Khi hiển thị trên màn hình được chia tỷ lệ tuyến tính thành 8 bit,
các giá trị cao chiếm ưu thế trên màn hình, dẫn đến mất chi tiết hình ảnh ở các giá
trị cường độ thấp hơn trong quang phổ. Bằng cách tính toán nhật ký, phạm vi động
theo thứ tự, ví dụ, 106, được giảm xuống còn khoảng 14 [tức là, loge (106) = 13 .
8], dễ quản lý hơn nhiều.
Khi thực hiện một phép biến đổi logarit, chúng ta thường mong muốn đưa các giá
trị nén kết quả trở lại toàn bộ phạm vi của màn hình. Đối với 8 bit, cách dễ nhất để
thực hiện việc này trong MATLAB là với câu lệnh
>> gs = im2uint8 ( mat2gray (g) );
Sử dụng mat2g ray đưa các giá trị đến phạm vi [0, 1] và sử dụng im2uint8 đưa
chúng đến phạm vi [0, 255], chuyển đổi hình ảnh thành lớp uint8.
Hàm trong Hình 3.4 (a) được gọi là hàm biến đổi giãn tương phản vì nó mở rộng
phạm vi hẹp của mức đầu vào thành phạm vi rộng (kéo dài) của mức đầu ra. Kết
quả là hình ảnh có độ tương phản cao hơn. Thực tế, trong trường hợp giới hạn
được chỉ ra trong Hình 3.4 (b), đầu ra là một hình ảnh nhị phân. Hàm giới hạn này
được gọi là hàm ngưỡng, như chúng ta đã thảo luận trong Chương 11, là một công
cụ đơn giản được sử dụng để phân đoạn ảnh. Sử dụng ký hiệu được giới thiệu ở
đầu phần này, hàm trong Hình 3.4 (a) có dạng
trong đó r biểu thị cường độ của hình ảnh đầu vào, là giá trị cường độ tương ứng
trong hình ảnh đầu ra và E điều khiển độ dốc của hàm. Phương trình này được thực
hiện trong MATLAB cho một hình ảnh dấu chấm động như

Vì giá trị giới hạn của g là 1, các giá trị đầu ra không thể vượt quá phạm vi [0, 1]
khi làm việc với kiểu biến đổi này. Hình 3.4 (a) thu được với E = 20.
Hình 3.5 (a) là một phổ Fourier với các giá trị trong khoảng 0 đến l0^6, được hiển
thị trên một hệ thống hiển thị 8 bit, được chia tỷ lệ tuyến tính. Hình 3.5 (b) cho
thấy kết quả thu được bằng cách sử dụng các lệnh
>> g = im2uint8 ( mat2gray ( log(1 + double ( f ))));
>> imshow(g)
Sự cải thiện trực quan của g so với hình ảnh gốc là rõ ràng.
3.2.3 Chỉ định biến đổi cường độ tùy ý
Giả sử rằng cần phải biến đổi cường độ của một hình ảnh bằng cách sử dụng một
hàm biến đổi xác định. Gọi T là vectơ cột chứa các giá trị của hàm biến đổi. Ví dụ,
trong trường hợp ảnh 8 bit, T (1) là giá trị mà cường độ 0 trong ảnh đầu vào được
ánh xạ. T (2) là giá trị mà 1 được ánh xạ tới, v.v. với T (256) là giá trị mà cường độ
255 được ánh xạ.
Việc lập trình được đơn giản hóa đáng kể nếu chúng ta thể hiện các hình ảnh đầu
vào và đầu ra ở định dạng dấu phẩy động, với các giá trị trong khoảng [O 1]. Điều
này có nghĩa là tất cả các phần tử của vectơ cột T phải là số dấu phẩy động trong
cùng một phạm vi đó. Một cách đơn giản để triển khai ánh xạ cường độ là sử dụng
hàm interp1, đối với ứng dụng cụ thể này, có cú pháp
g = interp1 (z, T, f)
trong đó f là ảnh đầu vào, g là ảnh đầu ra, T là vectơ cột vừa giải thích và z là vectơ
cột có cùng độ dài với T, được tạo thành như sau:
z = linspace (0, 1, numel (T)) ';
Đối với giá trị pixel trong f, đầu tiên interp1 tìm giá trị đó trong abscissa (z). Sau
đó, nó tìm (nội suy) t giá trị tương ứng trong T và xuất ra giá trị nội suy thành g ở
vị trí pixel tương ứng. Ví dụ, giả sử rằng T là phép biến đổi âm, T = [1 0] 'Khi đó,
vì T chỉ có hai phần tử nên z = [0 1]'. Giả sử rằng một pixel trong f có giá trị 0,75.
Pixel tương ứng tính bằng g sẽ được gán giá trị 0,25. Quá trình này không khác gì
ánh xạ từ các cường độ đầu vào đến đầu ra được minh họa trong Hình.3.4 (a),
nhưng sử dụng một hàm biến đổi tùy ý T (r). Nội suy I là bắt buộc vì chúng ta chỉ
có một số điểm rời rạc nhất định cho T, trong khi r có thể có bất kỳ giá trị nào
trong phạm vi [0 1].
3.2.4 Một số chức năng M tiện ích cho biến đổi cường độ
Trong phần này, chúng tôi phát triển hai hàm M tùy chỉnh kết hợp các khía cạnh
khác nhau của phép biến đổi cường độ được giới thiệu trong ba phần trước. Chúng
tôi hiển thị các chi tiết của mã cho một trong số chúng để minh họa cho việc kiểm
tra lỗi, để giới thiệu các cách mà các hàm MATLAB có thể được xây dựng để
chúng có thể xử lý một số đầu vào và / hoặc đầu ra khác nhau và hiển thị các định
dạng mã điển hình được sử dụng trong suốt sách. Kể từ thời điểm này, mã chi tiết
của các hàm M mới chỉ được đưa vào các cuộc thảo luận của chúng tôi khi mục
đích là để giải thích các cấu trúc lập trình cụ thể, để minh họa việc sử dụng
MATLAB hoặc chức năng Hộp công cụ xử lý hình ảnh mới hoặc để xem lại các
khái niệm được giới thiệu trước đó. Nếu không, chỉ có cú pháp của hàm được giải
thích và mã của nó được bao gồm trong Phụ lục C. Ngoài ra, để tập trung vào cấu
trúc cơ bản của các hàm được phát triển trong phần còn lại của cuốn sách, đây là
phần cuối cùng chúng tôi trình bày sử dụng rộng rãi việc kiểm tra lỗi. Các thủ tục
sau là điển hình về cách xử lý lỗi được lập trình trong MATLAB.
Xử lý một số lượng biến đầu vào và / hoặc đầu ra
Để kiểm tra số lượng đối số được nhập vào một hàm M, chúng ta sử dụng hàm
nargin,
n = nargin
trả về số lượng đối số thực tế được nhập vào M-function. Tương tự như vậy, hàm
nargout được sử dụng cùng với các đầu ra của một hàm M. Cú pháp là
n = nargout
Ví dụ: giả sử rằng chúng ta thực thi hàm M giả định sau tại dấu nhắc:
>> T = testhv (4, 5 ) ;
Việc sử dụng nargin trong phần nội dung của hàm này sẽ trả về giá trị 2, trong khi
việc sử dụng nargout sẽ trả về giá trị 1.
Hàm nargchk có thể được sử dụng trong phần thân của hàm M để kiểm tra xem số
lượng đối số chính xác đã được truyền hay chưa. Cú pháp là
msg = nargchk(low , high , numbe r)
Hàm này trả về thông báo Không đủ đầu vào một rguments nếu số nhỏ hơn thấp
hoặc Quá nhiều đối số đầu vào nếu số lớn hơn cao. Nếu số nằm trong khoảng từ
thấp đến h igh (bao gồm), nargchk trả về một ma trận trống. Một cách sử dụng
thường xuyên của hàm nargchk là ngừng thực thi thông qua hàm lỗi nếu số lượng
đối số được nhập không chính xác. Số lượng các đối số đầu vào thực tế được xác
định bởi hàm nargin. Ví dụ: hãy xem xét đoạn mã sau:

mà chỉ có một đối số đầu vào sẽ tạo ra lỗi


Không đủ đối số đầu vào.
và việc thực thi sẽ chấm dứt.
Sẽ rất hữu ích khi có thể viết các hàm trong đó số lượng các đối số đầu vào và /
hoặc đầu ra là thay đổi. Đối với điều này, chúng tôi sử dụng các biến varargin và
varargout. Trong phần khai báo, varargin và varargout phải là chữ thường. Ví dụ,
function [m, n] = testhv3 ( varargin )
chấp nhận một số lượng biến đầu vào vào hàm testhv3. m, và
function [ varargout ] = testhv4 (m, n, p)
trả về một số lượng biến đầu ra từ hàm test.hv4. nếu hàm tes thv3, chẳng hạn, một
đối số đầu vào cố định, x, theo sau là một số lượng biến đối số đầu vào, thì
function [m, n] = testhv3 (x, vara rgin )
sẽ khiến varargin bắt đầu với đối số đầu vào thứ hai do người dùng cung cấp khi
hàm được gọi. Nhận xét tương tự áp dụng cho varargout. Có thể chấp nhận được
một hàm trong đó cả số lượng đối số đầu vào và đầu ra đều thay đổi.
Khi varargin được sử dụng làm đối số đầu vào của một hàm, MATLAB
đặt nó thành một mảng ô (xem Phần 2.10.7) có chứa các đối số do người dùng
cung cấp. Bởi vì varargin là một mảng ô, một khía cạnh quan trọng của sự sắp xếp
này là lệnh gọi hàm có thể chứa một tập hợp các đầu vào hỗn hợp. Ví dụ: giả sử
rằng mã của hàm giả định testhv3 của chúng tôi được trang bị để xử lý nó, thì một
cú pháp hoàn toàn chấp nhận được có một tập hợp các đầu vào có thể là
>> [m, n] = testhv3 (f, [0 0.5 1 . 5 ) , A, ' label ' );
trong đó f là một hình ảnh, đối số tiếp theo là một vectơ hàng có độ dài 3, A là ma
trận và 'nhãn' là một chuỗi ký tự. Đây là một tính năng mạnh mẽ có thể được sử
dụng để đơn giản hóa cấu trúc của các chức năng yêu cầu nhiều loại đầu vào khác
nhau. Nhận xét tương tự áp dụng cho varargout.
Một chức năng M khác để biến đổi cường độ
Trong phần này, chúng tôi phát triển một hàm tính toán các hàm chuyển đổi sau:
âm, log, gamma và giãn tương phản. Các phép biến đổi này được chọn vì chúng ta
sẽ cần chúng sau này, và cũng để minh họa cơ học liên quan đến việc viết hàm M
cho các phép biến đổi cường độ. Khi viết hàm này, chúng tôi sử dụng hàm tofloat,
[g, revertclass ] = tofloat (f)
đã giới thiệu trong Mục 2.7. Nhớ lại từ cuộc thảo luận đó rằng hàm này chuyển đổi
hình ảnh của lớp logic, uintB, uint 1 6 hoặc int16 thành lớp đơn, áp dụng hệ số tỷ
lệ thích hợp. Nếu f thuộc loại kép hoặc đơn thì g = f; Ngoài ra, hãy nhớ lại rằng
revertclass là một hàm xử lý có thể được sử dụng để chuyển đầu ra trở lại cùng lớp
với f.
Lưu ý trong hàm M sau đây, chúng tôi gọi là intrans, cách các tùy chọn hàm được
định dạng trong phần Trợ giúp của mã, cách xử lý một số lượng biến đầu vào, cách
kiểm tra lỗi được xen kẽ trong mã và cách lớp của hình ảnh đầu ra được khớp với
lớp của đầu vào. Hãy nhớ khi nghiên cứu đoạn mã sau rằng varargin là một mảng
ô, vì vậy các phần tử của nó được chọn bằng cách sử dụng dấu ngoặc nhọn.
Như một minh họa của các intrans hàm, hãy xem hình ảnh trong Hình 3.6 (a), là
một ứng cử viên lý tưởng cho việc kéo giãn tương phản để nâng cao cấu trúc
xương. Kết quả trong Hình 3.6 (b) thu được với lệnh gọi intrans sau:
>> g = int rans (f, ' st retch ', mean2 ( tof loat (f) ), 0.9 ) ;
>> f igure , imshow(g)
Lưu ý cách hàm mean2 được sử dụng để tính giá trị trung bình của f trực tiếp bên
trong lệnh gọi hàm. Giá trị kết quả được sử dụng cho m. Hình ảnh f đã được
chuyển đổi thành dấu phẩy động bằng cách sử dụng tof loat để chia tỷ lệ các giá trị
của nó trong phạm vi [0, 1] để giá trị trung bình cũng sẽ nằm trong phạm vi này,
theo yêu cầu đối với đầu vào m. Giá trị của E được xác định một cách tương tác.
Một chức năng M để mở rộng cường độ
Khi làm việc với hình ảnh, các phép tính dẫn đến giá trị pixel trải dài trong phạm
vi rộng từ âm đến dương là điều phổ biến. Mặc dù điều này không gây ra vấn đề gì
trong quá trình tính toán trung gian, nhưng nó thực sự trở thành vấn đề khi chúng
tôi muốn sử dụng định dạng 8 bit hoặc 1 6 bit để lưu hoặc xem hình ảnh, trong
trường hợp đó, thường là mong muốn chia tỷ lệ hình ảnh đến mức đầy đủ , phạm vi
tối đa, [0, 255] hoặc [0, 65535]. Hàm M tùy chỉnh sau đây, mà chúng tôi gọi là
gscale, thực hiện được điều này. Ngoài ra, chức năng có thể ánh xạ các mức đầu ra
đến một phạm vi xác định. Mã cho chức năng này không bao gồm bất kỳ khái niệm
mới nào nên chúng tôi không đưa nó vào đây. Xem Phụ lục C để biết danh sách.
Cú pháp của hàm gscale là
g = gscale (f, method , low , high )

default), chia tỷ lệ đầu ra thành phạm vi đầy đủ [0, 255] và 'đầy đủ 16', chia tỷ lệ
đầu ra thành phạm vi đầy đủ [0, 65535]. Nếu được bao gồm, các thông số thấp và
cao sẽ bị bỏ qua trong hai chuyển đổi này. Giá trị hợp lệ thứ ba của phương thức là
'minmax', trong trường hợp đó các tham số thấp và cao, cả hai trong phạm vi [0, I],
phải được cung cấp. Nếu 'minmax' được chọn, các mức được ánh xạ tới phạm vi
[thấp, cao]. Mặc dù các giá trị này được chỉ định trong phạm vi [0, I], chương trình
thực hiện chia tỷ lệ thích hợp, tùy thuộc vào lớp của đầu vào. và sau đó chuyển đổi
đầu ra thành cùng lớp với đầu vào. Ví dụ: nếu f thuộc lớp uint8 và chúng tôi chỉ
định 'tối đa tối thiểu' với phạm vi [0, 0,5], đầu ra cũng sẽ thuộc lớp uint8, với các
giá trị trong phạm vi [0, 128]. Nếu f là dấu phẩy động và phạm vi giá trị của nó
nằm ngoài phạm vi [0, 1], chương trình sẽ chuyển nó thành phạm vi này trước khi
tiếp tục. Hàm gscale được sử dụng ở nhiều nơi trong suốt cuốn sách
3.3 Xử lý biểu đồ và lập đồ thị hàm
Các chức năng chuyển đổi cường độ dựa trên thông tin trích xuất từ biểu đồ cường
độ ảnh đóng vai trò trung tâm trong xử lý ảnh, trong các lĩnh vực như nâng cao,
nén, phân đoạn và mô tả. Trọng tâm của phần này là lấy, vẽ và sử dụng biểu đồ để
cải thiện hình ảnh. Các ứng dụng khác của biểu đồ sẽ được thảo luận trong các
chương sau.
3.3.1 Tạo và vẽ biểu đồ hình ảnh
Biểu đồ của một hình ảnh kỹ thuật số với L tổng mức cường độ có thể có trong
khoảng [0, G] được định nghĩa là hàm rời rạc

trong đó rk là mức cường độ thứ k trong khoảng [0, G] và nk là số pixel trong ảnh
có mức cường độ là rk. Giá trị của G là 255 cho hình ảnh của lớp uint8, 65535 cho
hình ảnh của lớp uint16 và 1 .0 cho hình ảnh dấu chấm động. Lưu ý rằng G = L-1
cho hình ảnh của lớp uint8 và uint16.
Đôi khi cần phải làm việc với các biểu đồ chuẩn hóa, thu được đơn giản bằng cách
chia tất cả các phần tử của h (rk) cho tổng số pixel trong hình ảnh, mà chúng tôi ký
hiệu là n:

trong đó, đối với ảnh nguyên, k = 0, 1, 2, ..., L - 1. Từ xác suất cơ bản, chúng ta
nhận ra p (rk) là ước lượng xác suất xuất hiện của mức cường độ rk.
Chức năng cốt lõi trong hộp công cụ để xử lý biểu đồ hình ảnh là imhist, với cú
pháp cơ bản:
h = imhist (f, b)
trong đó f là hình ảnh đầu vào, h là biểu đồ của nó và b là số thùng được sử dụng
để hình thành biểu đồ (nếu b không được bao gồm trong đối số, b = 256 được sử
dụng theo mặc định). Một bin chỉ đơn giản là một phần nhỏ của thang cường độ.
Ví dụ: nếu chúng tôi đang làm việc với hình ảnh uint8 và chúng tôi đặt b = 2, thì
thang cường độ được chia thành hai phạm vi: 0 đến 1 27 và 128 đến 255. Biểu đồ
thu được sẽ có hai giá trị: h (1), bằng nhau đến số pixel trong ảnh có giá trị trong
khoảng [0, 1 27] và h (2), bằng số pixel có giá trị trong khoảng [128, 255]. Chúng
tôi có được biểu đồ chuẩn hóa bằng cách sử dụng biểu thức
p = imhist (f, b) /numel (f)
Nhớ lại Phần 2.10.3 rằng hàm numel (f) cho số phần tử trong mảng f (tức là số
pixel trong hình ảnh).
Xem xét hình ảnh, f, từ Hình 3.3 (a). Cách đơn giản nhất để vẽ biểu đồ của nó trên
màn hình là sử dụng imhist không có đầu ra được chỉ định:
>> imhist (f) ;
Hình 3.7 (a) cho thấy kết quả. Đây là mặc định hiển thị biểu đồ trong hộp công cụ.
Tuy nhiên, có nhiều cách khác để vẽ biểu đồ và chúng tôi nhân cơ hội này để giải
thích một số tùy chọn vẽ biểu đồ trong MATLAB đại diện cho những tùy chọn
được sử dụng trong các ứng dụng xử lý ảnh.
Biểu đồ cũng có thể được vẽ bằng biểu đồ thanh. Với mục đích này, chúng ta có
thể sử dụng hàm
bar ( horz , z, widt h)
trong đó z là vectơ hàng chứa các điểm được vẽ, horz là vectơ có cùng thứ nguyên
với z chứa các gia số của tỷ lệ ngang và chiều rộng là một số từ 0 đến 1. Nói cách
khác, các giá trị của horz cho các gia số theo chiều ngang và các giá trị của z là các
giá trị dọc tương ứng. Nếu bỏ qua horz, trục hoành được chia theo đơn vị từ 0 đến
chiều dài (z). Khi chiều rộng là 1, các thanh chạm nhau; khi nó là 0, các thanh là
các đường thẳng đứng. Giá trị mặc định là 0,8. Khi vẽ biểu đồ thanh, thông thường
sẽ giảm độ phân giải của trục hoành bằng cách chia nó thành các dải.
Các lệnh sau tạo ra biểu đồ thanh, với trục hoành được chia thành các nhóm có
khoảng 10 cấp độ:
>> h = imhist (f, 25 ) ;
>> horz = linspace (0, 255 , 25 ) ;
>> ba r ( horz , h)
>> axis([ 0 255 0 60000 ] )
>> set ( gca , ' xtick ', 0 : 50 : 255 )
>> set ( gca , ' ytick ', 0 : 20000 : 60000 )
Hình 3.7 (b) cho thấy kết quả. Đỉnh hẹp nằm ở cuối cao của thang cường độ trong
Hình 3.7 (a) thấp hơn trong biểu đồ hình cột vì các gia số ngang lớn hơn đã được
sử dụng trong biểu đồ đó. Tỷ lệ dọc trải dài phạm vi giá trị rộng hơn so với biểu đồ
đầy đủ trong Hình 3.7 (a) bởi vì chiều cao của mỗi thanh được xác định bởi tất cả
các pixel trong một phạm vi, thay vì tất cả các pixel có một giá trị duy nhất.
Câu lệnh thứ tư trong đoạn mã trước được sử dụng để mở rộng phạm vi dưới của
trục tung để phân tích trực quan và đặt trục hoành thành phạm vi giống như trong
Hình 3.7. Một trong những dạng cú pháp của hàm trục là
axis([horzmin horzmax vertmin ve rtmax ])
trong đó đặt các giá trị tối thiểu và lớn nhất theo trục ngang và trục dọc. Trong hai
câu lệnh cuối cùng, gca có nghĩa là "lấy trục hiện tại" (tức là các trục của hình
được hiển thị lần cuối), và xtick và ytick đặt dấu tích trục ngang và dọc trong các
khoảng được hiển thị. Một cú pháp khác được sử dụng thường xuyên là
axis tight
đặt giới hạn trục cho phạm vi dữ liệu.
Các nhãn trục có thể được thêm vào trục ngang và trục dọc của biểu đồ bằng cách
sử dụng các hàm
xlabel ( ' text st ring ' , ' font size ' , size)
ylabel ( ' text st ring ', ' font size ', size)
trong đó kích thước là cỡ chữ tính bằng điểm. Văn bản có thể được thêm vào nội
dung của hình bằng cách sử dụng văn bản hàm, như sau:
text ( xloc , yloc , ' text string ', ' f ontsize ', size )
trong đó xloc và yloc xác định vị trí mà văn bản bắt đầu. Việc sử dụng ba chức
năng này được minh họa trong Ví dụ 3.4. Điều quan trọng cần lưu ý là các hàm đặt
giá trị trục và nhãn được sử dụng sau khi hàm đã được vẽ biểu đồ.
Tiêu đề có thể được thêm vào một âm mưu bằng cách sử dụng tiêu đề hàm, có cú
pháp cơ bản là
title ( ' titlestring ' )
trong đó vòng lớn nhất là chuỗi ký tự sẽ xuất hiện trên tiêu đề, ở chính giữa cốt
truyện.
Biểu đồ gốc tương tự như biểu đồ thanh. Cú pháp là
stem ( horz , z, ' LineSpec ', ' fill ' )
trong đó z là vectơ hàng chứa các điểm được vẽ và horz được mô tả cho thanh
chức năng. Nếu bỏ qua horz, trục hoành được chia theo đơn vị từ 0 đến chiều dài
(z), như trước đó.
Đối số,
LineSpec
là một bộ ba giá trị từ Bảng 3.1. Ví dụ: gốc (horz, h, 'r - p') tạo ra một biểu đồ gốc
trong đó các đường và điểm đánh dấu có màu đỏ, các đường nét đứt và các điểm
đánh dấu là các ngôi sao năm điểm. Nếu sử dụng màu tô, điểm đánh dấu sẽ được tô
bằng màu được chỉ định trong phần tử đầu tiên của bộ ba. Màu mặc định là màu
xanh lam, đường kẻ mặc định là nét liền và điểm đánh dấu mặc định là hình tròn.
Biểu đồ gốc trong Hình 3.7 (c) thu được bằng cách sử dụng các câu lệnh

Tiếp theo, chúng ta xem xét biểu đồ hàm, biểu đồ này vẽ một tập hợp các điểm
bằng cách liên kết chúng với các đường thẳng. Cú pháp là
plot (horz, z, 'LineSpec')
trong đó các đối số được xác định trước đó cho các biểu đồ gốc. Như trong phần
gốc, các thuộc tính trong lô được chỉ định như một bộ ba. Các giá trị mặc định cho
biểu đồ là các đường liền nét màu xanh lam không có điểm đánh dấu. Nếu một bộ
ba được chỉ định trong đó giá trị ở giữa trống (hoặc bị bỏ qua), không có dòng nào
được vẽ. Như trước đây, nếu bỏ qua horz, trục hoành được chia theo đơn vị từ 0
đến chiều dài (z).
Biểu đồ trong Hình 3.7 (d) thu được bằng cách sử dụng các câu lệnh sau:

Biểu đồ hàm được sử dụng thường xuyên để hiển thị các hàm biến đổi (xem Ví dụ
3.5).
Trong các giới hạn trục thảo luận trước đó và các dấu đánh dấu đã được đặt thủ
công. Để đặt giới hạn và đánh dấu tự động, hãy sử dụng các hàm ylim và xlim,
theo mục đích của chúng tôi ở đây, có các dạng cú pháp
ylim ( ' auto')
xlim ( ' auto ' )
Trong số các biến thể có thể có khác của cú pháp cho hai hàm này (xem tài liệu trợ
giúp để biết chi tiết), có một tùy chọn thủ công, được cung cấp bởi
ylim ([ ymin ymax])
xlim ([ xmin xmax])
cho phép đặc tả thủ công các giới hạn. Nếu các giới hạn chỉ được chỉ định cho một
trục, thì các giới hạn trên trục khác được đặt thành 'tự động' theo mặc định. Chúng
tôi sử dụng các chức năng này trong phần sau. Nhấn giữ tại dấu nhắc giữ lại biểu
đồ hiện tại và các thuộc tính trục nhất định để các lệnh vẽ đồ thị tiếp theo thêm vào
biểu đồ hiện có.
Một hàm biểu đồ khác đặc biệt hữu ích khi xử lý các hàm xử lý (xem Phần 2.1 0.4
và 2.10.5) là hàm f biểu đồ. Cú pháp cơ bản là
fplot ( fhandle , limits , ' LineSpec ' )
trong đó điều khiển f là một điều khiển hàm và giới hạn là một vectơ xác định các
giới hạn trục x, [xmin xmax]. Bạn sẽ nhớ lại từ cuộc thảo luận về thời gian hàm
trong Phần 2.10.5 rằng việc sử dụng các chốt điều khiển hàm cho phép cú pháp của
hàm cơ bản độc lập với các tham số của 'hàm được xử lý (được vẽ trong trường
hợp này). Ví dụ, để vẽ biểu đồ của hàm tiếp tuyến hyperbol, tanh, trong phạm vi (-
2 2] bằng cách sử dụng một đường chấm, chúng tôi viết
>> fhandle = @tanh ;
>> fplot ( f handle , ( -2 2 ] , ' : ' )
Hàm fplot sử dụng một sơ đồ điều khiển gia tăng tự động, thích ứng để tạo ra một
đồ thị đại diện, tập trung chi tiết hơn khi tốc độ thay đổi là lớn nhất. Do đó, người
dùng chỉ có thể chỉ định các giới hạn vẽ biểu đồ. Mặc dù điều này đơn giản hóa các
nhiệm vụ vẽ biểu đồ, nhưng tính năng tự động đôi khi có thể mang lại kết quả
không mong muốn. Ví dụ, nếu ban đầu một hàm bằng 0 trong một khoảng đáng kể,
thì fplot có thể giả sử rằng hàm bằng 0 và chỉ vẽ đồ thị 0 cho toàn bộ khoảng.
Trong những trường hợp như vậy, bạn có thể chỉ định một số điểm tối thiểu để
hàm vẽ biểu đồ. Cú pháp là
fplot (fhandle , limits , ' LineSpec ' , n)
Việc chỉ định n> = 1 buộc fplot vẽ biểu đồ hàm với tối thiểu n + 1 điểm, sử dụng
kích thước bước là (1 / n) * (upper_lim - lowe r_lim), trong đó trên và dưới là giới
hạn trên và dưới được chỉ định trong giới hạn s.
3.3.2 Cân bằng biểu đồ
Giả sử trong một thời điểm rằng các mức cường độ là đại lượng liên tục được
chuẩn hóa thành phạm vi [O, 1] và đặt p, (r) biểu thị hàm mật độ xác suất (PDF)
của các mức cường độ trong một hình ảnh nhất định, trong đó chỉ số con được sử
dụng cho phân biệt giữa các tệp PDF của hình ảnh đầu vào và đầu ra. Giả sử rằng
chúng ta thực hiện phép biến đổi sau trên các mức đầu vào để thu được mức cường
độ đầu ra (đã xử lý), s

trong đó w là một biến giả của tích hợp. Có thể chỉ ra rằng (Gonzalez và Woods
[2008]) rằng hàm mật độ xác suất của các mức sản lượng là đồng nhất; đó là,

Nói cách khác, phép biến đổi trước đó tạo ra một hình ảnh có các mức cường độ có
khả năng như nhau và ngoài ra, bao phủ toàn bộ phạm vi [0, 1]. Kết quả thực của
quá trình cân bằng mức cường độ này là hình ảnh có dải động tăng lên, sẽ có xu
hướng có độ tương phản cao hơn. Lưu ý rằng hàm biến đổi thực sự không khác gì
hàm phân phối tích lũy (CDF).
Khi xử lý các số lượng rời rạc, chúng tôi làm việc với biểu đồ và gọi kỹ thuật trước
là cân bằng biểu đồ, mặc dù nói chung, biểu đồ của hình ảnh được xử lý sẽ không
đồng nhất, do bản chất rời rạc của các biến. Tham khảo các thảo luận trong Phần
3.3. 1, đặt p, (r) cho j = 0, 1, 2, ..., L - 1, biểu thị biểu đồ được liên kết với các mức
cường độ của một hình ảnh nhất định và nhớ lại rằng các giá trị trong biểu đồ
chuẩn hóa là gần đúng với xác suất xuất hiện của từng mức cường độ trong ảnh.
Đối với các đại lượng rời rạc, chúng tôi làm việc với các phép tính tổng, và phép
biến đổi cân bằng trở thành
cho k = 0, 1, 2, ..., L - 1, trong đó sk là giá trị cường độ trong ảnh đầu ra (đã xử lý)
tương ứng với giá trị rk trong ảnh đầu vào.
Cân bằng biểu đồ được thực hiện trong hộp công cụ bởi hàm histeq, có cú pháp
g = histeq (f, nlev )
trong đó f là ảnh đầu vào và nlev là số mức cường độ được chỉ định cho ảnh đầu ra.
Nếu nlev bằng L (tổng số mức có thể có trong ảnh đầu vào), thì h isteq thực hiện
trực tiếp hàm biến đổi. Nếu nlev nhỏ hơn L, thì histeq sẽ cố gắng phân phối các
mức để chúng sẽ gần đúng với một biểu đồ phẳng. Không giống như imhist, giá trị
mặc định trong histeq là nlev = 64. Phần lớn, chúng tôi sử dụng số cấp tối đa có thể
(thường là 256) cho nlev vì điều này tạo ra triển khai thực sự của phương pháp cân
bằng biểu đồ vừa được mô tả.
Hình 3.8 (a) là ảnh kính hiển vi điện tử của phấn hoa, được phóng đại khoảng 700
lần. Về mặt nâng cao cần thiết, các tính năng quan trọng nhất của hình ảnh này là
nó tối và có dải động thấp. Những đặc điểm này thể hiện rõ ràng trong biểu đồ
trong Hình 3.8 (b), trong đó bản chất tối của hình ảnh khiến biểu đồ bị lệch về phía
cuối tối của thang màu xám. Dải động thấp thể hiện rõ ràng là biểu đồ hẹp so với
toàn bộ thang màu xám. Gọi f biểu thị hình ảnh đầu vào, trình tự các bước sau
được tạo ra Hình. 3.8 (a) đến (d):
Hình ảnh trong Hình 3.8 (c) là kết quả cân bằng biểu đồ. Sự cải thiện về cường độ
trung bình và độ tương phản là rõ ràng. Những đặc điểm này cũng được thể hiện rõ
ràng trong biểu đồ của hình ảnh này, được thể hiện trong Hình 3.8 (d). Sự gia tăng
độ tương phản là do sự trải rộng đáng kể của biểu đồ trên toàn bộ thang cường độ.
Sự gia tăng cường độ tổng thể là do mức cường độ trung bình trong biểu đồ của
hình ảnh cân bằng cao hơn (nhẹ hơn) so với ban đầu. Mặc dù phương pháp cân
bằng biểu đồ vừa thảo luận không tạo ra biểu đồ phẳng, nhưng nó có đặc tính
mong muốn là có thể tăng phạm vi động của các mức cường độ trong ảnh.
Như đã lưu ý trước đó, hàm chuyển đổi được sử dụng trong cân bằng biểu đồ là
tổng tích lũy của các giá trị biểu đồ chuẩn hóa. Chúng ta có thể sử dụng hàm cums
um để có được hàm chuyển đổi, như sau:
>> hnorm = imhist (f) . / n umel ( f ) ; % Normalized histogram .
>> cdf = cumsum ( hnorm ) ; % GDF .
Một biểu đồ cdf, được hiển thị trong Hình 3.9, được lấy bằng các lệnh sau:

Văn bản trong phần nội dung của biểu đồ đã được chèn bằng cách sử dụng lệnh
TextBox và Arrow từ menu Chèn trong cửa sổ hình MATLAB có chứa biểu đồ.
Bạn có thể sử dụng chú thích hàm để viết mã chèn các mục như hộp văn bản và
mũi tên trên biểu đồ, nhưng menu Chèn dễ sử dụng hơn đáng kể.
Bạn có thể thấy bằng cách nhìn vào biểu đồ trong Hình 3.8 rằng hàm biến đổi
trong Hình 3.9 ánh xạ một phạm vi hẹp của mức cường độ ở phần cuối dưới của
thang cường độ đầu vào với phạm vi cường độ đầy đủ trong hình ảnh đầu ra. Sự
cải thiện về độ tương phản của hình ảnh được thể hiện rõ ràng bằng cách so sánh
hình ảnh đầu vào và đầu ra trong Hình 3.8.
3.3.3 Đối sánh biểu đồ (Đặc điểm kỹ thuật)
Cân bằng biểu đồ tạo ra một chức năng chuyển đổi có tính thích ứng, theo nghĩa là
nó dựa trên biểu đồ của một hình ảnh nhất định. Tuy nhiên, khi hàm biến đổi cho
một hình ảnh đã được tính toán, nó sẽ không thay đổi trừ khi biểu đồ của hình ảnh
thay đổi. Như đã lưu ý trong phần trước, cân bằng biểu đồ đạt được sự nâng cao
bằng cách trải rộng các mức của hình ảnh đầu vào trên một phạm vi rộng hơn của
thang cường độ. Chúng tôi cho thấy trong phần này không phải lúc nào điều này
cũng dẫn đến kết quả thành công. Đặc biệt, nó rất hữu ích trong một số ứng dụng
để có thể chỉ định hình dạng của biểu đồ mà chúng tôi muốn hình ảnh được xử lý
có. Phương pháp được sử dụng để tạo một hình ảnh có biểu đồ cụ thể được gọi là
đối sánh biểu đồ hoặc đặc tả biểu đồ.
Phương pháp này đơn giản về nguyên tắc. Hãy xem xét một lúc các mức liên tục
được chuẩn hóa trong khoảng [O, 1] và đặt r và z biểu thị mức cường độ của hình
ảnh đầu vào và đầu ra. Các mức đầu vào có hàm mật độ xác suất p, (r) và các mức
đầu ra có hàm mật độ xác suất xác định p_ (z). Chúng ta biết từ cuộc thảo luận
trong phần trước rằng anh ấy biến đổi

kết quả là các mức cường độ, s, với hàm mật độ xác suất đồng nhất p, (s). Giả sử
bây giờ chúng ta xác định một biến z với thuộc tính

Hãy nhớ rằng chúng ta đang theo dõi một hình ảnh có mức cường độ, z, có mật độ
xác định p_ (z). Từ hai phương trình trước, nó theo sau rằng

Chúng ta có thể tìm T (r) từ hình ảnh đầu vào (đây là phép biến đổi cân bằng biểu
đồ được thảo luận trong phần trước), do đó, sau đó chúng ta có thể sử dụng phương
trình trước để tìm các mức biến đổi z có mật độ là p xác định, ( z) với điều kiện là
chúng ta có thể tìm thấy H^-1. Khi làm việc với các biến rời rạc, chúng ta có thể
đảm bảo rằng nghịch đảo của H tồn tại nếu p (zk) là một biểu đồ hợp lệ (tức là nó
có đơn vị diện tích và tất cả các giá trị của nó là không âm) và không có các thành
phần của nó bằng 0 [tức là không có bin nào của p (zk) trống]. Như trong cân bằng
biểu đồ, việc triển khai rời rạc của phương pháp trước đó chỉ mang lại giá trị gần
đúng với biểu đồ được chỉ định.
Hộp công cụ thực hiện đối sánh biểu đồ bằng cú pháp sau trong biểu đồ:
g = histeq (f, hspec )
trong đó f là hình ảnh đầu vào, hspec là biểu đồ được chỉ định (một vectơ hàng của
các giá trị được chỉ định) và g là hình ảnh đầu ra, có biểu đồ gần đúng với biểu đồ
được chỉ định, hspec. Vectơ này phải chứa các số nguyên tương ứng với các thùng
cách đều nhau. Một thuộc tính của histeq là biểu đồ của g thường đối sánh tốt hơn
với hspec khi độ dài (hspec) nhỏ hơn nhiều so với số mức cường độ trong f.
Hình 3.l0 (a) cho thấy một hình ảnh, f, của mặt trăng Sao Hỏa, Phobos và Hình
3.l0 (b) cho thấy biểu đồ của nó, thu được bằng cách sử dụng imhist (f). Hình ảnh
bị chi phối bởi các vùng tối lớn, dẫn đến biểu đồ đặc trưng bởi sự tập trung lớn các
điểm ảnh ở phần cuối tối của thang màu xám. Thoạt nhìn, người ta có thể kết luận
rằng cân bằng biểu đồ sẽ là một cách tiếp cận tốt để nâng cao hình ảnh này, để các
chi tiết trong vùng tối trở nên rõ ràng hơn. Tuy nhiên, kết quả trong Hình 3.lO (c),
thu được bằng lệnh
>> f1 = histeq (f, 256 ) ;
cho thấy rằng việc cân bằng biểu đồ trên thực tế đã tạo ra một hình ảnh có vẻ ngoài
"bị trôi" - không phải là một kết quả đặc biệt tốt trong trường hợp này. Có thể thấy
lý do cho điều này bằng cách nghiên cứu biểu đồ của hình ảnh cân bằng, được hiển
thị trong Hình 3.10 (d). Ở đây, chúng ta thấy rằng các mức cường độ đã được
chuyển sang một nửa trên của thang màu xám, do đó tạo cho hình ảnh có độ tương
phản thấp, bị trôi như đề cập ở trên. Nguyên nhân của sự thay đổi là sự tập trung
lớn của các thành phần tối ở hoặc gần 0 trong biểu đồ gốc. Hàm biến đổi tích lũy
thu được từ biểu đồ này là dốc, do đó ánh xạ mức độ tập trung lớn của các pixel ở
phần cuối thấp của thang màu xám đến phần cuối cao của thang.
Một khả năng để khắc phục tình trạng này là sử dụng đối sánh biểu đồ, với biểu đồ
mong muốn có nồng độ thành phần thấp hơn ở phần cuối thấp của thang màu xám
và duy trì hình dạng chung của biểu đồ của hình ảnh gốc. Chúng tôi lưu ý từ Hình
3. lO (b) rằng biểu đồ về cơ bản là hai phương thức, với một chế độ lớn ở gốc, và
một chế độ khác, nhỏ hơn, ở cuối cao của thang màu xám. Ví dụ, các loại biểu đồ
này có thể được mô hình hóa bằng cách sử dụng các hàm Gaussian đa phương
thức. Hàm M sau đây tính toán một hàm Gaussian hai phương thức được chuẩn
hóa thành diện tích đơn vị, vì vậy nó có thể được sử dụng như một biểu đồ cụ thể.
Hàm tương tác sau đây chấp nhận đầu vào từ bàn phím và vẽ biểu đồ của hàm
Gaussian. Tham khảo Phần 2.10.6 để biết giải thích về đầu vào hàm. Lưu ý cách
giới hạn của các ô được thiết lập.

Vì vấn đề với cân bằng biểu đồ trong ví dụ này chủ yếu là do sự tập trung lớn của
các điểm ảnh trong ảnh gốc với các mức gần 0, một cách tiếp cận hợp lý là sửa đổi
biểu đồ của ảnh đó để nó không có thuộc tính này. Hình 3.l l (a) cho thấy một đồ
thị của một hàm (có được bằng chương trình hướng dẫn sử dụng) giữ nguyên hình
dạng chung của biểu đồ ban đầu, nhưng có sự chuyển tiếp mượt mà hơn các mức
trong .. vùng tối của thang cường độ. Đầu ra của chương trình, p, bao gồm 256
điểm cách đều nhau từ hàm này và là biểu đồ được chỉ định mong muốn. Một hình
ảnh với biểu đồ được chỉ định đã được tạo bằng lệnh
>> g = histeq ( f , p )
Hình 3.1 1 (b) cho thấy kết quả. Sự cải thiện đối với kết quả được biểu đồ hóa
trong Hình 3.lO (c) là rõ ràng. Lưu ý rằng biểu đồ được chỉ định thể hiện một sự
thay đổi khá khiêm tốn so với biểu đồ ban đầu. Đây là tất cả những gì cần thiết để
có được sự cải tiến đáng kể trong việc nâng cao. Biểu đồ của Hình 3. 11 (b) được
thể hiện trong Hình 3.1 l (c). Đặc điểm phân biệt nhất của biểu đồ này là cách điểm
cuối thấp nhất của nó đã được di chuyển đến gần vùng sáng hơn của thang màu
xám và do đó gần hơn với hình dạng được chỉ định. Tuy nhiên, lưu ý rằng sự dịch
chuyển sang phải không cực đoan như sự dịch chuyển trong biểu đồ trong Hình
3.l0 (d), tương ứng với hình ảnh được nâng cao kém của Hình 3.l0 (c)

3.3.4 Chức năng thích ứng


Chức năng hộp công cụ này thực hiện cái gọi là cân bằng biểu đồ thích ứng giới
hạn độ tương phản (CLAHE). Không giống như các phương pháp được thảo luận
trong hai phần trước, hoạt động trên toàn bộ hình ảnh, phương pháp này bao gồm
xử lý các vùng nhỏ của hình ảnh (được gọi là ô) bằng cách sử dụng đặc tả biểu đồ
cho từng ô riêng lẻ. Các ô lân cận sau đó được kết hợp bằng cách sử dụng phép nội
suy song tuyến để loại bỏ các ranh giới giả tạo. Có thể hạn chế độ tương phản, đặc
biệt là ở những vùng có cường độ đồng nhất để tránh nhiễu khuếch đại. Cú pháp
cho histeq thích ứng là
g = adapthisteq ( f, pa ram1 , val 1 , pa ram2 , val2 , ...)
trong đó f là hình ảnh đầu vào, g là hình ảnh đầu ra và các cặp param / val được liệt
kê trong Bảng 3.2.
Hình 3.12 (a) giống như Hình 3. l0 (a) và Hình 3. 12 (b) là kết quả của việc sử
dụng tất cả các cài đặt mặc định trong biểu đồ thích ứng chức năng:
>> g1 = adapthisteq(f) ;
Mặc dù kết quả này cho thấy độ chi tiết tăng lên một chút nhưng những phần đáng
kể của hình ảnh vẫn ở trong bóng tối. Hình 3.12 (c) cho thấy kết quả của việc tăng
kích thước của các ô lên [25 25]:
>> g2 = adapthisteq (f, ' NumTiles ', [ 25 25 ] );
Độ sắc nét tăng lên một chút, nhưng không có chi tiết mới nào được nhìn thấy. Sử
dụng lệnh
>> g3 = adapthisteq ( f, ' NumTiles ' , [ 25 25 ] , ' Cliplimi t' , 0. 05 ) ;
mang lại kết quả trong Hình 3.12 (d). Sự cải thiện về chi tiết trong hình ảnh này là
đáng kể so với hai kết quả trước đó. Trên thực tế, so sánh Figs. 3.12 (d) và 3. 11
(b) cung cấp một ví dụ điển hình về lợi thế mà nâng cao cục bộ có thể có so với các
phương pháp nâng cao toàn cầu. Nói chung, cái giá phải trả là sự phức tạp của
chức năng bổ sung.
3.4 Lọc không gian
Như đã đề cập trong Phần 3.1 và được minh họa trong Hình 3.1, xử lý vùng lân cận
bao gồm (1) chọn một điểm trung tâm, (x, y); (2) thực hiện một phép toán chỉ liên
quan đến các pixel trong vùng lân cận được xác định trước khoảng (x, y); (3) để
kết quả của hoạt động đó là "phản hồi" của quá trình tại thời điểm đó; và (4) lặp lại
quy trình cho mọi điểm trong ảnh. Quá trình di chuyển điểm trung tâm tạo ra các
vùng lân cận mới, một vùng cho mỗi pixel trong hình ảnh đầu vào. Hai thuật ngữ
chính được sử dụng để xác định hoạt động này là xử lý vùng lân cận và lọc không
gian, với thuật ngữ thứ hai phổ biến hơn. Như được giải thích trong phần sau, nếu
các phép tính được thực hiện trên các pixel của vùng lân cận là tuyến tính, thì phép
toán được gọi là lọc không gian tuyến tính (thuật ngữ tích chập không gian cũng
được sử dụng); nếu không nó được gọi là lọc không gian phi tuyến.
3.4.1 Lọc không gian tuyến tính
Khái niệm lọc tuyến tính có nguồn gốc từ việc sử dụng phép biến đổi Fourier để xử
lý tín hiệu trong miền tần số, một chủ đề được thảo luận chi tiết trong Chương 4.
Trong chương này, chúng tôi quan tâm đến các phép lọc được thực hiện trực tiếp
trên các pixel. của một hình ảnh. Việc sử dụng thuật ngữ lọc không gian tuyến tính
phân biệt loại quy trình này với lọc miền tần số.
Các phép toán tuyến tính được quan tâm trong chương này bao gồm nhân mỗi
pixel trong vùng lân cận với một hệ số tương ứng và cộng các kết quả để thu được
phản hồi tại mỗi điểm (x, y). Nếu vùng lân cận có kích thước m X n thì cần có mn
hệ số. Các hệ số được sắp xếp dưới dạng ma trận, được gọi là bộ lọc, mặt nạ, mặt
nạ lọc, hạt nhân, khuôn mẫu hoặc cửa sổ, với ba số hạng đầu tiên là phổ biến nhất.
Vì những lý do sẽ trở nên rõ ràng trong thời gian ngắn, thuật ngữ bộ lọc tích chập,
mặt nạ tích chập, hoặc nhân tích chập, cũng được sử dụng.
Hình 3.13 minh họa cơ chế của lọc không gian tuyến tính. Quá trình này bao gồm
di chuyển tâm của mặt nạ bộ lọc, w, từ điểm này sang điểm khác trong hình ảnh, /.
Tại mỗi điểm (x, y), phản hồi của bộ lọc tại điểm đó là tổng các tích của các hệ số
bộ lọc và các pixel lân cận tương ứng trong vùng được bao quanh bởi mặt nạ bộ
lọc. Đối với mặt nạ có kích thước m X n, chúng ta thường giả sử rằng m = 2a + 1
và n = 2b + I trong đó a và b là các số nguyên không âm. Tất cả điều này nói lên
rằng trọng tâm chính của chúng tôi là tập trung vào các mặt nạ có kích thước lẻ,
với kích thước có ý nghĩa nhỏ nhất là 3 X 3. Mặc dù chắc chắn không phải là yêu
cầu, nhưng làm việc với các mặt nạ kích thước lẻ sẽ trực quan hơn vì chúng có
điểm trung tâm rõ ràng.
lọc không gian tuyến tính sai. Một là tương quan; còn lại là tích chập. Tương quan
là quá trình truyền mặt nạ w bởi mảng ảnh f theo cách được mô tả trong Hình 3.13.
Về mặt cơ học, tích chập là một quá trình giống nhau, ngoại trừ việc w được xoay
180 ° trước khi chuyển nó qua .f. Hai khái niệm này được giải thích tốt nhất bằng
một số ví dụ.
Hình 3.14 (a) cho thấy một hàm một chiều, / và một mặt nạ, w. Gốc của f được giả
thiết là điểm tận cùng bên trái của nó. Để thực hiện mối tương quan của hai hàm,
chúng ta di chuyển w sao cho điểm ngoài cùng bên phải của nó trùng với điểm gốc,
như Hình 3.14 (b) cho thấy. Nate rằng có những điểm giữa hai hàm không trùng
nhau. Cách phổ biến nhất để xử lý vấn đề này là padf với càng nhiều Os càng tốt
để đảm bảo rằng sẽ luôn có điểm tương ứng cho chuyến tham quan đầy đủ của w
quá khứ .f. Tình huống này được minh họa trong Hình 3.14 (c).
Bây giờ chúng tôi đã sẵn sàng để thực hiện tương quan. Giá trị đầu tiên của mối
tương quan là tổng tích của hai hàm ở vị trí được thể hiện trong Hình 3.14 (c).
Trong trường hợp này, tổng các sản phẩm là 0. Tiếp theo, chúng tôi di chuyển w
một vị trí sang bên phải và lặp lại quá trình [Hình. 3,14 (d)]. Tổng các sản phẩm lại
là 0. Sau bốn ca [Hình. 3,14 (e)], chúng ta gặp giá trị khác không đầu tiên của mối
tương quan. là (2) (1) = 2. Nếu chúng ta tiếp tục theo cách này cho đến khi w
chuyển hoàn toàn qua / [hình dạng kết thúc được thể hiện trong Hình 3.14 (f)],
chúng ta sẽ nhận được kết quả trong Hình 3.14 (g). Bộ giá trị này là mối tương
quan của w và f. Nếu chúng ta đã đệm w, hãy căn chỉnh phần tử ngoài cùng bên
phải với phần tử ngoài cùng bên trái của phần đệm w và thực hiện tương quan theo
cách vừa giải thích. kết quả sẽ khác (xoay 180 °), vì vậy thứ tự của các yếu tố quan
trọng trong mối tương quan.
Nhãn 'full' trong mối tương quan trong Hình 3.14 (g) là một cờ (sẽ được thảo luận
sau) được hộp công cụ sử dụng để chỉ ra mối tương quan bằng cách sử dụng một
hình ảnh đệm và được tính toán theo cách vừa được mô tả. Hộp công cụ cung cấp
một tùy chọn khác, được ký hiệu là 'giống nhau' [Hình. 3,14 (h)] tạo ra mối tương
quan có cùng kích thước với f. Tính toán này cũng sử dụng không đệm, nhưng vị
trí bắt đầu là với điểm trung tâm của mặt nạ (điểm có nhãn 3 in w) được căn chỉnh
với điểm gốc. Phép tính cuối cùng là với điểm trung tâm của mặt nạ được căn
chỉnh với điểm cuối cùng trong f.
Để thực hiện tích chập, chúng ta xoay w một góc 80 ° và đặt điểm ngoài cùng bên
phải của nó tại gốc của f, như Hình 3.140) cho thấy. Sau đó, chúng tôi lặp lại quy
trình trượt / tính toán được sử dụng trong mối tương quan, như được minh họa
trong Hình. 3,14 (k) đến (n). Kết quả tích chập 'full' và 'same' được hiển thị trong
Hình. 3,14 (0) và (p), tương ứng.
Hàm f trong Hình 3.14 là một xung đơn vị rời rạc là 1 tại một điểm và 0 ở mọi nơi
khác. Rõ ràng là kết quả trong Figs. 3.14 (o) hoặc (p) tích chập với một xung chỉ
"copies" tại vị trí của xung. Thuộc tính sao chép này (được gọi là sàng lọc) là một
khái niệm cơ bản trong lý thuyết hệ thống tuyến tính, và nó là lý do tại sao một
trong các hàm luôn quay 180 ° trong tích chập. Lưu ý rằng, không giống như sự
tương quan, việc hoán đổi thứ tự của các hàm sẽ mang lại cùng một kết quả tích
chập. Nếu hàm đang được dịch chuyển là đối xứng, thì rõ ràng là tích chập và
tương quan mang lại cùng một kết quả.
Các khái niệm trước dễ dàng mở rộng sang hình ảnh, như Hình 3.15 minh họa.
Điểm gốc là ở trên cùng, góc trái của hình f (x, y) (xem Hình 2.1). Để thực hiện
tương quan, chúng ta đặt điểm dưới cùng bên phải của w (x, y) sao cho nó trùng
với gốc của f (x, y) như trong Hình 3.15 (c). Lưu ý việc sử dụng khoảng đệm 0 vì
những lý do được đề cập trong phần thảo luận của Hình 3.14. Để thực hiện tương
quan, chúng tôi di chuyển w (x, y) ở tất cả các vị trí có thể sao cho ít nhất một
pixel của nó chồng lên một pixel trong ảnh gốc f (x, y). Mối tương quan 'f u 11'
này được thể hiện trong Hình 3.15 (d). Để có được mối tương quan 'giống nhau'
trong Hình 3.15 (e), chúng ta yêu cầu tất cả các chuyến du ngoạn của w (x, y) phải
sao cho pixel trung tâm của nó chồng lên f (x, y) ban đầu. Đối với tích chập, chúng
tôi xoay w (x, y) 180 ° và tiến hành theo cách tương tự như trong tương quan [xem
Hình. 3,15 (f) đến (h)]. Như trong ví dụ một chiều đã thảo luận trước đó, tích chập
mang lại cùng một kết quả độc lập với thứ tự của các hàm. Trong mối tương quan,
thứ tự có ý nghĩa, một thực tế được làm rõ trong hộp công cụ bằng cách giả định
rằng mặt nạ bộ lọc luôn là hàm trải qua quá trình dịch. Cũng lưu ý thực tế quan
trọng trong Figs. 3.15 (e) và (h) rằng các kết quả của tương quan không gian và
tích chập được xoay 180 ° đối với nhau. Điều này, tất nhiên, được mong đợi bởi vì
tích chập không có gì khác hơn là tương quan với mặt nạ bộ lọc xoay.
Tóm tắt phần thảo luận trước ở dạng phương trình, chúng ta có tương quan của mặt
nạ lọc w (x, y) có kích thước m x n với hàm f (x, y), được ký hiệu là w (x, y) "l'r f
(x, y), được cho bởi biểu thức

Phương trình này được đánh giá cho tất cả các giá trị của các biến dịch chuyển x và
y sao cho tất cả các phần tử của w truy cập vào mọi pixel trong f, mà chúng tôi giả
sử đã được đệm một cách thích hợp. Các hằng số a và b được cho bởi a = (m - 1) /
2 và b = (n - 1) / 2. Để thuận tiện cho việc ghi chú, chúng ta giả sử rằng m và n là
các số nguyên lẻ.
Theo cách tương tự, tích chập của w (x, y) và f (x, y), được ký hiệu là w (x, y) * f
(x, y), được đưa ra bởi biểu thức
trong đó các dấu trừ ở bên phải của phương trình lật f (tức là xoay nó một góc 80
°). Xoay và thay đổi / thay vì w được thực hiện để đơn giản hóa ký hiệu. Kết quả là
như nhau. t Các thuật ngữ trong phần tổng kết giống như đối với mối tương quan.
giống nhau. t Các thuật ngữ trong phần tổng kết giống như đối với mối tương quan.
Hộp công cụ thực hiện lọc không gian tuyến tính bằng cách sử dụng hàm imfilter,
có cú pháp sau:
g = imfilter(f, w, filtering_mode , boundary_options , size_options)
trong đó f là hình ảnh đầu vào, w là mặt nạ lọc, g là kết quả lọc và các tham số
khác được tóm tắt trong Bảng 3.3. Chế độ lọc được chỉ định là 'corr' cho sự tương
quan (đây là mặc định) hoặc là '' chuyển đổi 'cho tích chập. Ry_options giới hạn
giải quyết vấn đề đệm đường viền, với kích thước của đường viền được xác định
bởi kích thước của bộ lọc. Các tùy chọn này được giải thích thêm trong Ví dụ 3.8.
Các size_options là 'same' hoặc 'full', như được giải thích trong Hình. 3,14 và 3,15.
Cú pháp phổ biến nhất cho imfilter là
g = imfilter (f, w, ' replicate ')
Cú pháp này được sử dụng khi triển khai các bộ lọc không gian tuyến tính tiêu
chuẩn trong hộp công cụ. Các bộ lọc này, được thảo luận trong Phần 3.5.1, được
xoay trước 180 °, vì vậy chúng ta có thể sử dụng mặc định tương quan trong imf il
ter (từ cuộc thảo luận của Hình 3.15, chúng ta biết rằng việc thực hiện tương quan
với bộ lọc xoay là giống nhau khi thực hiện tích chập với bộ lọc ban đầu). Nếu bộ
lọc đối xứng về tâm của nó, thì cả hai tùy chọn đều tạo ra cùng một kết quả.
Khi làm việc với các bộ lọc không được xoay trước cũng như không đối xứng và
chúng tôi muốn thực hiện phép tích chập, chúng tôi có hai tùy chọn. Một là sử
dụng cú pháp
g = imfilter(f, w, ' conv ' , ' replicate ')
Cách tiếp cận khác là sử dụng chức năng rot90 (w, 2) để xoay w 180 °, và sau đó
sử dụng imfilter (f, w, 'replicate'). Hai bước có thể được kết hợp thành một:
g = imfilter(f, rot90 (w, 2 ) , ' replicate ')
Kết quả sẽ là một hình ảnh, g, có cùng kích thước với đầu vào (tức là, mặc định là
chế độ 'giống nhau' đã thảo luận trước đó).
mặc định là chế độ 'giống nhau' đã thảo luận trước đó). Mỗi phần tử của hình ảnh
được lọc được tính toán bằng số học dấu phẩy động. Tuy nhiên, imfilter chuyển
đổi hình ảnh đầu ra thành cùng một lớp của đầu vào. Do đó, nếu f là một mảng số
nguyên, thì các phần tử đầu ra vượt quá phạm vi của kiểu số nguyên sẽ bị cắt bớt
và các giá trị phân số được làm tròn. Nếu kết quả mong muốn có độ chính xác cao
hơn, thì f nên được chuyển đổi thành dấu phẩy động bằng cách sử dụng các hàm
im2s ingle, im2double hoặc tofloat (xem Phần 2.7) trước khi sử dụng imfilter.
Hình 3.16 (a) là một ảnh kép lớp, f, có kích thước 512 X 512 pixel. Xem xét bộ lọc
31 x 31
>> w = ones ( 31 );
tỷ lệ với bộ lọc trung bình. Chúng tôi đã không chia các hệ số cho (3 1) 2 để minh
họa ở phần cuối của ví dụ này về hiệu ứng chia tỷ lệ của việc sử dụng imfilter với
hình ảnh của lớp uint8.
Chuyển đổi bộ lọc w với một hình ảnh tạo ra kết quả mờ. Bởi vì bộ lọc là đối xứng,
chúng tôi có thể sử dụng mặc định tương quan trong imfilter. Hình 3.16 (b) cho
thấy kết quả của việc thực hiện thao tác lọc sau:
>> gd = imf ilte r(f, w) ;
>> imshow(gd, [ ])
nơi chúng tôi đã sử dụng tùy chọn ranh giới mặc định, đặt đường viền của hình ảnh
bằng Os (màu đen). Như mong đợi, các cạnh giữa màu đen và trắng trong hình ảnh
được lọc bị mờ, nhưng các cạnh giữa các phần sáng của hình ảnh và ranh giới cũng
vậy. Nguyên nhân là do viền đệm có màu đen. Chúng ta có thể giải quyết khó khăn
này bằng cách sử dụng tùy chọn 'replicate'
>> gr = imf ilter (f, w, ' replicate ');
>> figure , imshow(gr, [ ])
Như Hình 3.16 (c) cho thấy, các đường viền của hình ảnh được lọc bây giờ xuất
hiện như mong đợi. Trong trường hợp này, kết quả tương đương nhận được với tùy
chọn 'symmetric'
>> gs = imfilte r(f, w, ' symmet ric ');
>> f igure , imshow(gs , [ ])
Hình 3.16 (d) cho thấy kết quả. Tuy nhiên, sử dụng tùy chọn 'cyclear'
>> gc = imf ilte r(f, w, ' circular ');
>> figure , imshow(gc , [ ])
tạo ra kết quả trong Hình 3.16 (e), cho thấy vấn đề tương tự như với không đệm.
Điều này đúng như mong đợi vì việc sử dụng tính tuần hoàn làm cho các phần màu
đen của hình ảnh tiếp giáp với các vùng sáng.
Cuối cùng, chúng tôi minh họa thực tế là imfilt er tạo ra kết quả cùng lớp với đầu
vào có thể dẫn đến khó khăn như thế nào nếu không được xử lý đúng cách:

Hình 3.16 (f) cho thấy kết quả của các hoạt động này. Ở đây, khi đầu ra được
chuyển thành lớp của đầu vào (uint8) bởi imf ilter, việc cắt bớt gây ra một số mất
mát dữ liệu. Nguyên nhân là do các hệ số của mặt nạ không tổng hợp thành phạm
vi [O, 1], dẫn đến các giá trị được lọc bên ngoài phạm vi [O, 255]. Do đó, để tránh
khó khăn này, chúng tôi có tùy chọn chuẩn hóa các hệ số để tổng của chúng nằm
trong khoảng [0, 1] (trong trường hợp hiện tại, chúng tôi sẽ chia các hệ số cho (3 1)
2 để tổng sẽ là 1 ), hoặc nhập dữ liệu ở định dạng đơn hoặc kép. Tuy nhiên, lưu ý
rằng ngay cả khi tùy chọn thứ hai được sử dụng, dữ liệu thường phải được chuẩn
hóa thành định dạng hình ảnh hợp lệ tại một số thời điểm (ví dụ: để lưu trữ). Một
trong hai cách tiếp cận đều hợp lệ; điểm quan trọng là các phạm vi dữ liệu phải
được lưu ý để tránh kết quả không mong muốn.

3.4.2 Lọc không gian phi tuyến


Lọc không gian phi tuyến cũng dựa trên các phép toán lân cận và cơ chế trượt điểm
trung tâm của một bộ lọc m X n qua một hình ảnh cũng giống như đã thảo luận
trong phần trước. Tuy nhiên, trong khi lọc không gian tuyến tính dựa trên việc tính
toán tổng các sản phẩm (là một phép toán tuyến tính), thì lọc không gian phi tuyến
dựa trên các phép toán phi tuyến liên quan đến các pixel trong vùng lân cận được
bộ lọc bao bọc. Ví dụ: để phản hồi tại mỗi điểm trung tâm bằng giá trị pixel lớn
nhất trong vùng lân cận của nó là một hoạt động lọc phi tuyến. Một sự khác biệt cơ
bản khác là khái niệm mặt nạ không phổ biến trong xử lý phi tuyến. Ý tưởng về bộ
lọc được thực hiện, nhưng "bộ lọc" nên được hình dung như một hàm phi tuyến
hoạt động trên các pixel của vùng lân cận và phản hồi của nó tạo thành kết quả của
hoạt động phi tuyến.
Hộp công cụ cung cấp hai chức năng để thực hiện lọc phi tuyến chung: nlfilter và
colfilt. Trước đây thực hiện các hoạt động trực tiếp trong 2-D, trong khi col f il t tổ
chức dữ liệu dưới dạng cột. Mặc du colfilt yêu cầu nhiều bộ nhớ hơn, nó thường
thực thi nhanh hơn đáng kể so với nlfilter. Trong hầu hết các ứng dụng xử lý hình
ảnh, tốc độ là một yếu tố quan trọng, vì vậy nói chung colf ilt được ưu tiên hơn nlf
il t để thực hiện lọc không gian phi tuyến.
Cho một hình ảnh đầu vào f có kích thước MXN và một vùng lân cận có kích
thước m X n, hàm colfilt tạo ra một ma trận, gọi nó là A, có kích thước tối đa mn X
MN, t trong đó mỗi cột tương ứng với các pixel được bao quanh bởi vùng lân cận
được căn giữa tại một vị trí trong hình ảnh. Ví dụ: cột đầu tiên tương ứng với các
pixel được bao quanh bởi vùng lân cận khi tâm của nó nằm ở trên cùng, điểm
ngoài cùng bên trái trong f. Tất cả các phần đệm bắt buộc được xử lý trong suốt
bằng colfilt bằng cách sử dụng không đệm.
Cú pháp của hàm colfilt là
g = colfilt (f, [m n ] , ' sliding ', fun )
trong đó, như trước đây, m và n là kích thước của vùng bộ lọc, 'liding' chỉ ra rằng
quá trình này là một trong những thao tác trượt vùng m X n từ pixel này sang pixel
khác trong hình ảnh đầu vào f và điều thú vị là một hàm xử lý ( xem Phần 2.10.4).
Do cách tổ chức ma trận A, hàm fun phải hoạt động trên từng cột của A riêng lẻ và
trả về một vectơ hàng, v, có phần tử thứ k là kết quả của phép toán hàm fun trên
cột thứ k của A. Vì có thể có tối đa MN cột trong A nên kích thước lớn nhất của v
là 1 X MN.
Lọc tuyến tính được thảo luận trong phần trước có các điều khoản cho phần đệm
để xử lý các vấn đề về biên giới vốn có trong lọc không gian. Tuy nhiên, khi sử
dụng colfilt, hình ảnh đầu vào phải được đệm rõ ràng trước khi lọc. Đối với điều
này, chúng tôi sử dụng hàm padar ray, đối với các hàm 2-D, có cú pháp
fp = padar ray (f, [r c ] , method , direction )
trong đó f là hình ảnh đầu vào, fp là hình ảnh đệm, [r c] cho biết số hàng và cột để
đệm f, và phương thức và ion trực tiếp như được giải thích trong Bảng 3.4. Ví dụ,
nếu f = [1 2; 3 4], lệnh
>> fp = padarray (f, [3 2 ] , ' replicate ', ' post ')
tạo ra kết quả

Nếu hướng không được bao gồm trong đối số, mặc định là 'cả hai'. Nếu phương
thức không được bao gồm, phần đệm mặc định là Os.
Như một minh họa của hàm col f il t, chúng tôi triển khai một bộ lọc phi tuyến mà
phản hồi tại bất kỳ điểm nào là trung bình hình học của các giá trị cường độ của
các pixel trong vùng lân cận được căn giữa tại điểm đó. Giá trị trung bình hình học
trong vùng lân cận có kích thước m X n là tích số của các giá trị cường độ trong
vùng lân cận được nâng lên lũy thừa 1 / mn. Đầu tiên, chúng tôi triển khai chức
năng lọc phi tuyến dưới dạng một hàm xử lý ẩn danh (xem Phần 2.10.4):
>> gmean = @(A) prod (A, 1)A1 / size (A, 1));
Để giảm hiệu ứng đường viền, chúng tôi chèn hình ảnh đầu vào bằng cách sử dụng
tùy chọn 'replicate' trong function padarray:
f = padarray (f, [m n ] , ' replicate ');
Tiếp theo, chúng tôi gọi là colfilt:
>> g = colf ilt (f, [m n ] , ' s liding ', @gmean );
Có một số điểm quan trọng ở đây. Đầu tiên, hãy lưu ý rằng ma trận A được tự
động chuyển đến hàm xử lý gmean bằng hàm ilt. Thứ hai, như đã đề cập trước đó,
ma trận A luôn có mn hàng, nhưng số cột là thay đổi. Do đó gmean (hoặc bất kỳ
hàm xử lý nào khác được colfilt chuyển qua) phải được viết theo cách có thể xử lý
một số cột thay đổi.
Quá trình lọc trong trường hợp này bao gồm tính toán tích của tất cả các pixel
trong vùng lân cận và sau đó nâng kết quả lên lũy thừa l / mn. Đối với bất kỳ giá trị
nào của (x, y), kết quả được lọc tại điểm đó được chứa trong cột thích hợp ở câu v.
Yêu cầu quan trọng là hàm hoạt động trên các cột của A, bất kể có bao nhiêu và trả
về một vectơ hàng chứa kết quả cho tất cả các cột riêng lẻ. Sau đó, hàm colfilt lấy
các kết quả đó và sắp xếp lại chúng để tạo ra hình ảnh đầu ra, g.
Cuối cùng, chúng tôi xóa phần đệm đã chèn trước đó:
>> [M, N] = size(f) ;
>> g = g ( ( 1 :M) + m, ( 1 :N) + n ) ;
sao cho g có cùng kích thước với f.
Một số bộ lọc phi tuyến thường được sử dụng có thể được triển khai theo các hàm
MATLAB và hộp công cụ khác như imfilter và ordf il t2 (xem Phần 3.5.2). Ví dụ,
hàm spf il t trong Phần 5.3, thực hiện bộ lọc trung bình hình học trong Ví dụ 3.9 về
mặt imf il ter và các hàm exp và log MATLAB. Khi điều này là có thể, hiệu suất
thường nhanh hơn nhiều và việc sử dụng bộ nhớ là một phần nhỏ của bộ nhớ theo
yêu cầu của col f il t. Tuy nhiên, colfil t vẫn là lựa chọn tốt nhất cho các hoạt động
lọc phi tuyến không có các triển khai thay thế như vậy.
3.5 Hộp công cụ xử lý hình ảnh Bộ lọc không gian tiêu chuẩn
Trong phần này, chúng ta thảo luận về các bộ lọc không gian tuyến tính và phi
tuyến được hỗ trợ bởi hộp công cụ. Các chức năng bộ lọc tùy chỉnh bổ sung được
thực hiện trong Phần 5.3.
3.5.1 Bộ lọc không gian tuyến tính
Hộp công cụ hỗ trợ một số bộ lọc không gian tuyến tính 2-D được xác định trước,
thu được bằng cách sử dụng hàm fspecial, tạo mặt nạ bộ lọc, w, sử dụng cú pháp
w = fspecial ( ' type ' , parameters )
trong đó 'type' chỉ định loại bộ lọc và rs tham số xác định thêm bộ lọc được chỉ
định. Các bộ lọc không gian mà fspecial có thể tạo ra được tóm tắt trong Bảng 3.5,
bao gồm các thông số áp dụng cho mỗi bộ lọc.
Chúng tôi minh họa việc sử dụng fspecial và imfilt er bằng cách nâng cao hình ảnh
với bộ lọc Laplacian. Laplacian của hình ảnh f (x, y), được ký hiệu là V2f (x, y),
được định nghĩa là

Các phép xấp xỉ kỹ thuật số thường được sử dụng của các dẫn xuất thứ hai là

Biểu thức này có thể được triển khai tại tất cả các điểm trong một hình ảnh bằng
cách xoay hình ảnh với mặt nạ không gian sau
Một định nghĩa thay thế của các dẫn xuất kỹ thuật số thứ hai có tính đến các yếu tố
đường chéo và có thể được triển khai bằng cách sử dụng mặt nạ

Cả hai dẫn xuất đôi khi được xác định với các dấu hiệu đối lập với các dấu hiệu
được hiển thị ở đây, dẫn đến các mặt nạ là âm của hai mặt nạ trước đó.
Cải tiến bằng cách sử dụng Laplacian dựa trên phương trình

trong đó f (x, y) là hình ảnh đầu vào, g (x, y) là hình ảnh nâng cao và c là 1 nếu hệ
số trung tâm của mặt nạ là dương hoặc -1 nếu nó là âm (Gonzalez và Woods [2008
]). Bởi vì Laplacian là một toán tử phái sinh, nó làm sắc nét hình ảnh nhưng đưa
các vùng không đổi về 0. Việc thêm lại hình ảnh gốc sẽ khôi phục tông màu ở mức
xám.
Hàm f đặc biệt ('laplacian', alpha) triển khai tổng quát hơn Mặt nạ Laplacian:

cho phép tinh chỉnh kết quả nâng cao. Tuy nhiên, việc sử dụng chủ yếu của
Laplacian dựa trên hai mặt nạ vừa thảo luận.
Bây giờ chúng ta tiến hành nâng cao hình ảnh trong Hình 3.17 (a) bằng cách sử
dụng Laplacian. Hình ảnh này là hình ảnh bị mờ nhẹ của mặt trăng ở Cực Bắc. Cải
tiến trong trường hợp này bao gồm làm sắc nét hình ảnh, trong khi vẫn giữ được
nhiều tông màu xám nhất có thể. Đầu tiên, chúng tôi tạo và hiển thị bộ lọc
Laplacian:

Lưu ý rằng bộ lọc thuộc loại dou ble và hình dạng của nó với alpha = 0 là bộ lọc
Laplacian đã được thảo luận trước đây. Chúng tôi có thể dễ dàng xác định hình
dạng này theo cách thủ công như
>> w = [ 0 1 0 ; 1 -4 ' 1 ; 0 1 0 ] ;
Tiếp theo, chúng tôi áp dụng w cho hình ảnh đầu vào, f [Hình 3.l 7 (a)], thuộc lớp
uint8:
>> g 1 = imfilte r(f, w, ' replicate ');
>> imshow(g1 , [ ])
Hình 3.l 7 (b) cho thấy hình ảnh kết quả. Kết quả này trông có vẻ hợp lý, nhưng có
một vấn đề: tất cả các pixel của nó đều dương. Do hệ số lọc trung tâm âm, chúng ta
biết rằng nói chung chúng ta có thể mong đợi có hình ảnh Laplacian với các giá trị
âm và dương. Tuy nhiên, f trong trường hợp này thuộc lớp uint8 và, như đã thảo
luận trong phần trước, imf il t er đưa ra đầu ra cùng lớp với hình ảnh đầu vào, vì
vậy các giá trị âm bị cắt bớt. Chúng tôi giải quyết khó khăn này bằng cách chuyển
f thành dấu phẩy động trước khi lọc nó:

Kết quả, được hiển thị trong Hình 3.1 7 (c), là điển hình của sự xuất hiện của hình
ảnh Laplacian.
Cuối cùng, chúng tôi khôi phục các tông màu xám bị mất bằng cách sử dụng
Laplacian bằng cách trừ (vì hệ số trung tâm là âm) hình ảnh Laplacian khỏi hình
ảnh gốc:

Kết quả, được hiển thị trong Hình 3.17 (d), sắc nét hơn so với hình ảnh gốc.
Các vấn đề nâng cao thường yêu cầu các bộ lọc ngoài những bộ lọc có sẵn trong
hộp công cụ. Laplacian là một ví dụ điển hình. Hộp công cụ hỗ trợ bộ lọc
Laplacian 3 X 3 với -4 ở trung tâm. Thông thường, tăng cường sắc nét hơn có được
bằng cách sử dụng bộ lọc Laplacian 3 X 3 có -8 ở trung tâm và được bao quanh bởi
Is, như đã thảo luận trước đó. Mục đích của ví dụ này là thực hiện bộ lọc này theo
cách thủ công và cũng để so sánh kết quả thu được bằng cách sử dụng hai công
thức Laplacian. Trình tự các lệnh như sau:

Hình 3.18 (a) hiển thị lại hình ảnh mặt trăng ban đầu để dễ so sánh. Hình 3.18 (b)
là g4, giống như Hình 3.17 (d) và Hình 3.18 (c) cho thấy gB. Đúng như dự đoán,
kết quả này sắc nét hơn đáng kể so với Hình 3.18 (b)
3.5.2 Bộ lọc không gian phi tuyến
Hàm ordfilt2, tính toán các bộ lọc thống kê thứ tự (còn gọi là bộ lọc xếp hạng).
Đây là các bộ lọc không gian phi tuyến có phản ứng dựa trên việc sắp xếp (xếp
hạng) các pixel chứa trong vùng lân cận hình ảnh và sau đó thay thế giá trị của
pixel trung tâm trong vùng lân cận bằng giá trị được xác định bởi kết quả xếp hạng.
Sự chú ý được tập trung trong phần này vào các bộ lọc phi tuyến được tạo bởi o rdf
il t2. Một số chức năng lọc phi tuyến tùy chỉnh bổ sung được phát triển và thực
hiện trong Phần 5.3.
Cú pháp cho hàm ordfilt2 là
g = ordfilt2 ( f , order, domain )
Hàm này tạo ra hình ảnh đầu ra g bằng cách thay thế từng phần tử bị tắt bởi phần
tử thứ r trong tập hợp các hàng xóm được sắp xếp được chỉ định bởi các phần tử
khác không trong miền. Ở đây, miền là một ma trận m x n gồm ls và Os xác định
các vị trí pixel trong vùng lân cận sẽ được sử dụng trong tính toán. Theo nghĩa này,
miền hoạt động giống như một mặt nạ logic. Các pixel trong vùng lân cận tương
ứng với 0 trong ma trận miền không được sử dụng trong tính toán. Ví dụ, để triển
khai bộ lọc tối thiểu (bậc 1) có kích thước m X n, chúng ta sử dụng cú pháp
g = ordfilt2 ( f , 1, ones (m, n ) )
Trong công thức này, 1 biểu thị mẫu đầu tiên trong tập mn mẫu có thứ tự, và
những cái (m, n) tạo ra m X n ma trận ls, chỉ ra rằng tất cả các mẫu lân cận sẽ được
sử dụng trong tính toán.
Theo thuật ngữ thống kê, bộ lọc min (mẫu đầu tiên của tập hợp có thứ tự) được gọi
là phân vị thứ 0. Tương tự, phân vị thứ lOO là mẫu cuối cùng trong tập hợp có thứ
tự, là mẫu thứ m. Điều này tương ứng với bộ lọc tối đa, được triển khai bằng cú
pháp...
g = ordfilt2 (f, m*n , ones (m, n ) )
Bộ lọc thống kê thứ tự nổi tiếng nhất trong xử lý hình ảnh kỹ thuật số là bộ lọc t
trung vị, tương ứng với phân vị thứ 50:
g = ordfilt2 (f, ( m*n + 1) /2, ones (m, n ) )
đối với m và n lẻ. Do tầm quan trọng thực tế của nó, hộp công cụ cung cấp triển
khai chuyên biệt của bộ lọc trung vị 2-D:
g = medfilt2 (f, [m n ] , padopt )
trong đó tuple [mn] xác định vùng lân cận có kích thước m X n mà trên đó trung vị
được tính và padopt chỉ định một trong ba tùy chọn đệm đường viền có thể có: 'số
không' (mặc định), 'ric đối xứng' trong đó f được mở rộng đối xứng bằng cách phản
chiếu nó qua biên giới của nó, và được 'lập chỉ mục', trong đó f được đệm bằng ls
nếu nó thuộc loại kép và với Os nếu không. Mặc định,
g = medfilt2 (f)
sử dụng vùng lân cận 3 X 3 và đệm đường viền của đầu vào bằng Os.
Lọc trung vị là một công cụ hữu ích để giảm nhiễu hạt tiêu trong ảnh. Mặc dù
chúng ta thảo luận về việc giảm nhiễu chi tiết hơn nhiều trong Chương 5, nhưng tại
thời điểm này, sẽ mang tính hướng dẫn để minh họa ngắn gọn việc thực hiện lọc
trung vị.
Hình ảnh trong Hình 3.19 (a) là hình ảnh tia X, f, của một bảng mạch công nghiệp
được chụp trong quá trình kiểm tra tự động bảng. Hình 3.19 (b) là cùng một hình
ảnh bị nhiễu hạt tiêu, trong đó cả hai điểm đen và trắng đều có xác suất xuất hiện là
0,2. Hình ảnh này được tạo bằng cách sử dụng hàm imnoise, được thảo luận trong
Phần 5.2.1:
>> fn = imnoise (f, ' salt & pepper ', 0.2 ) ;
Hình 3.19 (c) là kết quả của việc lọc trung bình hình ảnh nhiễu này, sử dụng câu
lệnh:
>> gm = medfilt2 ( fn ) ;
Xem xét mức độ nhiễu trong Hình 3.19 (b), lọc trung vị bằng cách sử dụng các cài
đặt mặc định đã làm tốt công việc giảm nhiễu. Tuy nhiên, lưu ý rằng các đốm đen
xung quanh viền. Chúng được gây ra bởi các điểm đen xung quanh hình ảnh (nhớ
lại rằng các miếng đệm mặc định cho đường viền bằng Os). Loại hiệu ứng này có
thể được giảm bớt bằng cách sử dụng tùy chọn 'symmetric':
>> gms = medfilt2 (fn , ' symmetric ');
Kết quả được hiển thị trong Hình 3.19 (d), gần với kết quả trong Hình 3.19 (c),
ngoại trừ hiệu ứng viền đen không rõ rệt.
3.6 Sử dụng các kỹ thuật mờ để biến đổi cường độ và lọc không gian
Chúng tôi kết thúc chương này với phần giới thiệu về các tập mờ và ứng dụng của
chúng đối với các phép biến đổi cường độ và lọc không gian. Chúng tôi cũng phát
triển một tập hợp các hàm M tùy chỉnh để thực hiện các phương pháp mờ được
phát triển trong phần này. Như bạn sẽ thấy ngay sau đây, các tập mờ cung cấp một
khuôn khổ để kết hợp kiến thức của con người vào giải các bài toán mà công thức
của chúng dựa trên các khái niệm không chính xác.
3.6.1 Cơ sở
Tập hợp là tập hợp các đối tượng (phần tử) và lý thuyết tập hợp bao gồm các công
cụ xử lý các phép toán trên và giữa các tập hợp. Trung tâm của lý thuyết tập hợp là
khái niệm về thành viên tập hợp. Chúng ta đã quen với việc xử lý cái gọi là tập hợp
"sắc nét", có tư cách thành viên chỉ có thể đúng hoặc sai theo nghĩa truyền thống
của logic Boolean hai giá trị, với 1 thường biểu thị đúng và 0 thường biểu thị sai.
Ví dụ: giả sử Z biểu thị tập hợp tất cả mọi người và giả sử rằng chúng ta muốn xác
định một tập hợp con, A, của Z, được gọi là "tập hợp những người trẻ tuổi". Để tạo
thành tập con này, chúng ta cần xác định một hàm liên thuộc gán giá trị 1 hoặc 0
cho mọi phần tử, z, của Z. Bởi vì chúng ta đang xử lý logic hai giá trị, hàm liên
thuộc xác định ngưỡng bằng hoặc thấp hơn một người được coi là trẻ, và trên đó
một người được coi là không trẻ. Hình 3.20 (a) tóm tắt khái niệm này bằng cách sử
dụng ngưỡng tuổi là 20 tuổi, trong đó µ, A (z) biểu thị hàm thành viên vừa thảo
luận.
Chúng ta thấy ngay một khó khăn trong công thức này: Một người 20 tuổi được coi
là trẻ, nhưng một người 20 tuổi 1 giây không phải là thành viên của tập hợp những
người trẻ tuổi. Đây là một vấn đề cơ bản với các tập hợp sắc nét hạn chế việc sử
dụng chúng trong nhiều ứng dụng thực tế. Những gì chúng ta cần là sự linh hoạt
hơn trong ý nghĩa của chúng ta là "young;" nghĩa là, sự chuyển đổi dần dần từ trẻ
sang không trẻ. Hình 3.20 (b) cho thấy một khả năng. Đặc điểm cơ bản của hàm
này là nó có giá trị vô hạn, do đó cho phép chuyển đổi liên tục giữa trẻ và không
trẻ. Điều này làm cho nó có thể có mức độ "trẻ". Bây giờ chúng ta có thể đưa ra
các tuyên bố chẳng hạn như một người còn trẻ (ở phía trên bằng phẳng của đường
cong), tương đối trẻ (về phía đầu đoạn đường nối), 50% trẻ (ở giữa đoạn đường
nối), không quá trẻ (về phía cuối của đoạn đường nối), v.v. (lưu ý rằng việc giảm
độ dốc của đường cong trong Hình 3.20 (b) khiến chúng ta mơ hồ hơn về ý nghĩa
của từ "trẻ"). Những kiểu tuyên bố mơ hồ (mờ nhạt) này phù hợp hơn với những gì
con người chúng ta sử dụng khi nói một cách thiếu chính xác về tuổi tác. Do đó,
chúng ta có thể giải thích các hàm liên thuộc có giá trị vô hạn là nền tảng của logic
mờ và các tập được tạo ra bằng cách sử dụng chúng có thể được xem như là các
tập mờ.
3.6.2 Giới thiệu về tập mờ
Lý thuyết tập hợp mờ được L.A. Zadeh (Zadeh [1965]) đưa ra cách đây hơn bốn
thập kỷ. Như phần thảo luận sau đây cho thấy, các tập mờ cung cấp một phương
thức chính thức để xử lý thông tin không chính xác.

Definitions
Gọi Z là tập hợp các phần tử (đối tượng), với phần tử chung của Z ký hiệu là z;
nghĩa là, Z = {z}. Tập hợp Z thường được gọi là vũ trụ của diễn ngôn. Một tập mờ
A trong Z được đặc trưng bởi một hàm liên thuộc, µ.A (z), liên kết với mỗi phần tử
của Z một số thực trong khoảng [O, 1]. Đối với một phần tử cụ thể z0 từ Z, giá trị
của µ.A (z0) đại diện cho mức độ liên quan của z0 trong A.
Khái niệm "thuộc về", quá quen thuộc trong các tập hợp thông thường (sắc nét),
không có cùng ý nghĩa trong lý thuyết tập mờ. Với các tập hợp thông thường,
chúng ta nói rằng một phần tử thuộc hoặc không thuộc tập hợp. Với các tập mờ,
chúng ta nói rằng tất cả các z mà µ.A (z) = 1 là thành viên đầy đủ của tập A, tất cả
các z mà µ.A (z) nằm trong khoảng từ 0 đến 1 đều có thành viên một phần trong
tập, và tất cả z của mà µ.A (z) = 0 không có cấp độ thành viên trong tập hợp (đối
với tất cả các mục đích thực tế, có nghĩa là chúng không phải là thành viên của tập
hợp).
Ví dụ, trong Hình 3.20 (b) µ.A (25) = 0,5, chỉ ra rằng một người 25 tuổi có 0,5 cấp
thành viên trong tập hợp những người trẻ tuổi. Tương tự, hai người ở độ tuổi 15 và
35 có tư cách thành viên cấp độ 1,0 và 0,0 lần lượt trong tập hợp này. Do đó, một
tập mờ, A, là một cặp có thứ tự bao gồm các giá trị của z và một hàm liên thuộc
gán cấp thành viên trong A cho mỗi z. Đó là,

Khi z liên tục, A có thể có vô số phần tử. Khi z là rời rạc và phạm vi giá trị của nó
là hữu hạn, chúng ta có thể lập bảng các phần tử của A một cách rõ ràng. Ví dụ:
nếu độ tuổi trong Hình 3.20 được giới hạn ở các số nguyên, thì A có thể được viết
rõ ràng là

Lưu ý rằng, dựa trên định nghĩa trước đó, (30, 0) và các cặp sau đó được bao gồm
A, nhưng mức độ thành viên của chúng trong tập hợp này là 0. Trong thực tế,
chúng thường không được bao gồm vì sự quan tâm thường nằm ở các phần tử có
mức độ thành viên là nonzero. Bởi vì các hàm liên thuộc xác định duy nhất mức độ
thành viên trong một tập hợp, các thuật ngữ tập mờ và hàm liên thuộc được sử
dụng thay thế cho nhau trong tài liệu. Đây là một nguồn thường xuyên gây nhầm
lẫn, vì vậy bạn nên ghi nhớ việc sử dụng thường xuyên hai thuật ngữ này có nghĩa
giống nhau. Để giúp bạn trở nên thoải mái với thuật ngữ này, chúng tôi sử dụng
thay thế cả hai thuật ngữ trong phần này. Khi µ.A (z) chỉ có thể có hai giá trị,
chẳng hạn, 0 và 1, hàm liên thuộc giảm xuống hàm đặc trưng quen thuộc của các
tập hợp thông thường. Như vậy, tập hợp thông thường là một trường hợp đặc biệt
của tập mờ.
Mặc dù lôgic mờ và xác suất hoạt động trên cùng một khoảng [O, 1], có một sự
khác biệt đáng kể giữa hai điều này. Hãy xem xét ví dụ từ Hình 3.20. Một tuyên bố
xác suất có thể là: "Có 50% khả năng một người còn trẻ", trong khi một tuyên bố
mờ nhạt có thể là "Mức độ thành viên của một người trong nhóm những người trẻ
tuổi là 0,5". Sự khác biệt giữa hai tuyên bố này là quan trọng. Trong tuyên bố đầu
tiên, một người được coi là thuộc nhóm trẻ hoặc nhóm không trẻ; đơn giản là
chúng ta chỉ có 50% cơ hội biết người đó thuộc nhóm nào. Câu thứ hai giả định
rằng một người trẻ ở một mức độ nào đó, với mức độ đó trong trường hợp này là
0,5. Một cách hiểu khác là để nói rằng đây là một người trẻ "trung bình": không
thực sự trẻ, nhưng không quá gần là không trẻ. Nói cách khác, logic mờ không có
tính xác suất nào cả; nó chỉ đề cập đến các cấp độ thành viên trong một tập hợp.
Theo nghĩa này, chúng ta thấy rằng các khái niệm logic mờ tìm thấy ứng dụng
trong các tình huống được đặc trưng bởi tính mơ hồ và không chính xác, thay vì
ngẫu nhiên.
Các định nghĩa sau đây là cơ bản cho vật liệu trong các phần sau.
Tập hợp rỗng: Một tập mờ là trống nếu và chỉ khi hàm liên thuộc của nó giống
hệt 0 trong Z.
Bằng nhau: Hai tập mờ A và B bằng nhau, viết A = B, nếu và chỉ khi µ.A (z) =
µ.8 (z) với mọi z thuộc Z.
Phần bù: Phần bù (NOT) của một tập mờ A, ký hiệu là A ngang , hoặc NOT (A),
được định nghĩa là tập có hàm thuộc

Tập con: Tập mờ A là tập con của tập mờ B nếu và chỉ khi

Liên hiệp: Hợp nhất (OR) của hai tập mờ A và B, ký hiệu là AU B, hoặc A HOẶC
B, là một tập mờ U với hàm liên thuộc

Giao điểm: Giao (AND) của hai tập mờ A và B, ký hiệu là An B hoặc A VÀ B, là


tập mờ I có hàm liên thuộc

Lưu ý rằng các thuật ngữ quen thuộc KHÔNG, HOẶC và VÀ được sử dụng thay
thế cho nhau với các ký hiệu, U và n để biểu thị phần bổ sung tập hợp, sự kết hợp
và phần giao nhau tương ứng
Hình 3.21 minh họa một số định nghĩa trước đây. Hình 3.21 (a) cho thấy hàm liên
thuộc của hai tập A và B, và Hình 3.21 (b) cho thấy hàm liên thuộc của phần bù
của A. Hình 3.21 (c) cho thấy hàm liên thuộc của liên hợp A và B , và Hình 3.21
(d) cho thấy kết quả tương ứng cho giao của hai tập hợp này. Các đường đứt nét
trong Hình 3.21 chỉ được hiển thị để tham khảo. Kết quả của các phép toán mờ
được chỉ ra
trong Figs. 3,21 (b) - (d) là các đường liền nét.
Bạn có thể bắt gặp các ví dụ trong tài liệu trong đó khu vực dưới đường cong của
hàm liên thuộc, chẳng hạn, giao của hai tập mờ, được tô bóng để biểu thị kết quả
của phép toán. Đây là chuyển từ các hoạt động thiết lập thông thường và không
chính xác. Chỉ các điểm dọc theo chính hàm liên thuộc (đường liền nét) mới được
áp dụng khi xử lý các tập mờ. Đây là một minh họa tốt cho nhận xét được đưa ra
trước đó rằng một hàm liên thuộc và tập mờ tương ứng của nó là một và cùng một
thứ.
Chức năng thành viên
Bảng 3.6 liệt kê một tập hợp các hàm liên thuộc được sử dụng phổ biến cho công
việc tập mờ. Ba hàm đầu tiên là tuyến tính từng đoạn, hai hàm tiếp theo là trơn tru
và hàm cuối cùng là một Gaussian cắt ngắn. Chúng tôi phát triển các hàm M trong
Phần 3.6.4 để triển khai sáu hàm liên thuộc trong bảng.
3.6.3 Sử dụng bộ mờ
Trong phần này, chúng tôi phát triển nền tảng để sử dụng tập mờ, và sau đó áp
dụng các khái niệm được phát triển ở đây để xử lý ảnh trong Phần 3.6.5 và 3.6.6.
Chúng ta bắt đầu cuộc thảo luận với một ví dụ. Giả sử rằng chúng ta muốn phát
triển một hệ thống mờ để theo dõi sức khỏe của động cơ điện trong một trạm phát
điện. Đối với mục đích của chúng tôi, sức khỏe của động cơ được xác định bởi
lượng rung động mà nó thể hiện. Để đơn giản hóa cuộc thảo luận, giả sử rằng
chúng ta có thể hoàn thành nhiệm vụ giám sát bằng cách sử dụng một cảm biến
duy nhất xuất ra một số duy nhất: tần số rung trung bình, ký hiệu là z. Chúng tôi
quan tâm đến ba phạm vi tần số trung bình: thấp, trung bình và cao. Một động cơ
hoạt động ở dải tần thấp được cho là hoạt động bình thường, trong khi một động cơ
hoạt động ở dải tần trung bình được cho là hoạt động kém. Một động cơ có độ rung
trung bình ở dải cao được cho là đang hoạt động ở chế độ gần hỏng hóc.
Các dải tần số vừa thảo luận có thể được xem là mờ (theo cách tương tự như tuổi
trong Hình 3.20), và chúng ta có thể mô tả vấn đề bằng cách sử dụng, ví dụ, các
hàm liên thuộc mờ trong Hình 3.22 (a). Liên kết các biến với các hàm liên thuộc
mờ được gọi là mờ. Trong bối cảnh hiện tại, tần số là một biến ngôn ngữ và một
giá trị cụ thể của tần số, z0, được gọi là giá trị ngôn ngữ. Giá trị ngôn ngữ được
làm mờ đi bằng cách sử dụng một hàm liên thuộc để ánh xạ nó với khoảng [0, 1).
Hình 3.22 (b) cho thấy một ví dụ.
Hãy nhớ rằng các dải tần số là mờ, chúng ta có thể thể hiện kiến thức của mình về
vấn đề này theo các quy tắc IF-THEN mờ sau:
R1: IF tần số thấp, THEN/OR hoạt động của động cơ vẫn bình thường.

R2: IF tần số là giữa, THEN/OR hoạt động của động cơ là biên.


R3: IF tần số cao, THEN hoạt động của động cơ sắp hỏng.
Những quy tắc này thể hiện tổng số kiến thức của chúng ta về vấn đề; chúng chỉ
đơn giản là một chủ nghĩa hình thức cho một quá trình suy nghĩ.
Bước tiếp theo là tìm cách sử dụng đầu vào (đo tần số) và cơ sở tri thức được thể
hiện trong các quy tắc if-then để tạo ra các đầu ra của hệ mờ. Quá trình này được
gọi là hàm ý hoặc suy luận. Tuy nhiên, trước khi hàm ý có thể được áp dụng, tiền
trước của mỗi quy tắc phải được xử lý để mang lại một giá trị duy nhất. Như chúng
tôi trình bày ở cuối phần này, nhiều phần của tiền đề được liên kết bởi AND và
OR. Dựa trên các định nghĩa từ Phần 3.6.2, điều này có nghĩa là thực hiện các phép
toán tối thiểu và tối đa. Để đơn giản hóa giải thích hiện tại, ban đầu chúng tôi xử lý
các quy tắc có tiền đề chỉ chứa một phần.
Bởi vì chúng ta đang xử lý các đầu vào mờ, bản thân các đầu ra cũng mờ, vì vậy
các hàm liên thuộc cũng phải được xác định cho các đầu ra. Trong ví dụ này, kết
quả cuối cùng mà chúng ta quan tâm là phần trăm hoạt động bất thường của động
cơ. Hình 3.23 cho thấy các hàm liên thuộc được sử dụng để mô tả các kết quả đầu
ra thành ba lớp mờ: chuẩn, cận biên và gần hỏng. Lưu ý rằng biến độc lập của các
đầu ra là phần trăm bất thường (số càng thấp thì hệ thống càng khỏe mạnh), khác
với biến độc lập của các đầu vào.
Các chức năng thành viên trong Hình. 3.22 và 3.23, cùng với cơ sở quy tắc, chứa
tất cả thông tin cần thiết để liên quan đến đầu vào và đầu ra. Ví dụ, chúng tôi lưu ý
rằng quy tắc R 1 liên quan đến mức thấp VÀ bình thường. Đây không phải là thao
tác giao nhau (AND) được định nghĩa trước đó. Để tìm kết quả của phép toán
AND giữa hai hàm này, hãy nhớ lại từ Phần 3.6.2 rằng AND được định nghĩa là
hàm tối thiểu của hai hàm liên thuộc; đó là,

Kết quả này cũng là một chức năng thành viên. Nó là một hàm của hai biến vì hai
hàm liên thuộc ANDed có các biến độc lập khác nhau.

Phương trình trước là một kết quả chung. Chúng tôi quan tâm đến đầu ra do đầu
vào cụ thể. Gọi z0 là một giá trị cụ thể của tần số. Mức độ thành viên của đầu vào
này theo hàm liên thuộc thấp là µ, 10w (z0). Chúng tôi tìm thấy đầu ra tương ứng
với quy tắc R1 và đầu vào z0 bằng ANDing JL1 ow (z0) và 'kết quả chung µ, 1 (z,
v) được đánh giá tại z0:
trong đó bước cuối cùng tiếp theo bằng cách kiểm tra từ thực tế rằng JL1oJz0) là
một hằng số [xem Hình 3.22 (b)). Ở đây, Q1 (v) biểu thị đầu ra mờ do quy tắc R 1
và một đầu vào cụ thể. Biến duy nhất trong Q1 là biến đầu ra v, như mong đợi.
Theo cùng một dòng lập luận, chúng ta đi đến các đầu ra sau do hai quy tắc khác
và cùng một đầu vào cụ thể:

Mỗi phương trình trong số ba phương trình trước là đầu ra được kết hợp với một
quy tắc cụ thể và một đầu vào cụ thể. Mỗi phản hồi này là một tập mờ, mặc dù
thực tế rằng đầu vào là một giá trị cố định. Quy trình vừa được mô tả là quy trình
hàm ý được đề cập ở một vài đoạn trở lại, tạo ra kết quả đầu ra do các đầu vào và
kiến thức thể hiện trong các quy tắc if-then.
Để có được phản hồi tổng thể của hệ thống mờ, chúng tôi tổng hợp ba phản hồi
riêng lẻ. Trong cơ sở quy tắc được đưa ra ở đầu phần này, ba quy tắc được liên kết
bởi phép toán OR (union). Do đó, đầu ra mờ hoàn chỉnh (tổng hợp) được đưa ra
bởi

cho r = {1, 2, 3}, s = {thấp, trung bình, cao} và t = {tiêu chuẩn, thị trường, thất
bại}. Có nghĩa là các giá trị của s và tare được ghép nối trong các kết hợp hợp lệ
(tức là thấp và chuẩn, giữa và marg và cao và không đạt). Mặc dù nó được phát
triển trong ngữ cảnh của một ví dụ, nhưng biểu thức này là hoàn toàn chung chung;
để mở rộng nó thành n quy tắc, chúng ta chỉ cần đặt r = {1, 2, ..., n}; tương tự,
chúng ta có thể mở rộng s và t để bao gồm bất kỳ số hữu hạn hàm liên thuộc nào.
Hai phương trình trước nói cùng một điều: Đáp ứng, Q, của hệ mờ của chúng ta là
hợp của các tập mờ riêng lẻ tạo ra từ mỗi quy tắc bởi quá trình hàm ý.
Hình 3.24 tóm tắt các kết quả cho đến thời điểm này. Hình 3.24 (a) chứa các phần
tử cần thiết để tính toán các đầu ra Qi riêng lẻ. Q2 và Q3: (1) µ, s (z0) for s = {low,
mid, high} (đây là các hằng số-xem Hình 3.22); và (2) các hàm µ, 1 (v) cho t =
{norm, marg, fail}. Các Q; thu được bằng cách tính toán tối thiểu giữa các cặp
tương ứng của các đại lượng này. Hình 3.24 (b) cho thấy kết quả. Lưu ý rằng hiệu
quả thực của việc tính toán giá trị nhỏ nhất giữa mỗi µ, 1 (v) và hằng số IJ-s (z0)
tương ứng của nó không gì khác hơn là cắt bớt µ, 1 (v) tại giá trị của µ, 5 (z0).
Cuối cùng, chúng tôi thu được một đầu ra duy nhất (tổng hợp), Q (v), bằng cách
tính giá trị lớn nhất giữa cả ba Q; (v) tại mỗi giá trị của v. Hình 3.24 (c) cho thấy
kết quả
Chúng tôi đã thu được thành công đầu ra hoàn chỉnh tương ứng với một đầu vào cụ
thể, nhưng chúng tôi vẫn đang xử lý tập mờ, Q (v). Bước cuối cùng là để có được
đầu ra rõ nét, v0, từ tập mờ Q bằng cách sử dụng một quá trình thích hợp được gọi
là giải mờ .
Có một số cách để khử mờ Q để có được đầu ra rõ nét v0. Một cách tiếp cận phổ
biến là tính trọng tâm của Q (v):

Trong đó các tích phân được lấy trên phạm vi giá trị của biến độc lập, v. Trong Ví
dụ 3.14 (Phần 3.6.4), chúng tôi minh họa cách tính gần đúng hàm này bằng các
phép tính tổng, sử dụng Q từ Hình 3.24 (c) và một giá trị tần số cụ thể z0 = 0,7
[xem Hình 3.22 (b)]. Kết quả là v0 = 0,76, nghĩa là với giá trị tần số đó, động cơ
đang hoạt động với mức độ bất thường 76%.
Cho đến nay, chúng tôi đã xem xét các quy tắc if-then mà tiền thân chỉ có một
phần, chẳng hạn như "IF tần suất thấp." Các quy tắc có phần trước có nhiều hơn
một phần phải được kết hợp để tạo ra một số duy nhất đại diện cho toàn bộ phần
trước cho quy tắc đó. Ví dụ, giả sử rằng chúng ta có quy tắc: IF tần số thấp AND
nhiệt độ vừa phải THEN hoạt động của động cơ vẫn bình thường. Một hàm liên
thuộc sẽ phải được xác định cho điều kiện của biến ngôn ngữ. Sau đó, để có được
một số duy nhất cho quy tắc này có tính đến cả hai phần của tiền đề, trước tiên
chúng ta đánh giá một giá trị tần số nhất định bằng cách sử dụng hàm liên thuộc
thấp và một giá trị nhiệt độ đã cho bằng cách sử dụng hàm liên thuộc vừa phải. Bởi
vì hai phần được liên kết bởi AND, chúng tôi sử dụng giá trị tối thiểu của hai giá
trị kết quả. Giá trị này sau đó được sử dụng trong quá trình hàm ý để "cắt" hàm
thành viên đầu ra bình thường, là hàm được liên kết với quy tắc này. Phần còn lại
của quy trình vẫn như trước, như phần tóm tắt sau minh họa
Hình 3.25 cho thấy ví dụ động cơ sử dụng hai đầu vào, tần số và nhiệt độ. Chúng ta
có thể sử dụng hình này và tài liệu trước đó để tóm tắt các bước chính sau khi áp
dụng logic mờ dựa trên quy tắc:
1. Làm mờ các đầu vào: Đối với mỗi đầu vào vô hướng, hãy tìm các giá trị mờ
tương ứng bằng cách ánh xạ đầu vào đó với khoảng [O, 1] bằng cách sử dụng các
hàm liên thuộc áp dụng trong mỗi quy tắc, như hai cột đầu tiên của Hình 3.25 cho
thấy.
2. Thực hiện bất kỳ phép toán logic mờ nào được yêu cầu: Đầu ra của tất cả các
phần của tiền đề phải được kết hợp để mang lại một giá trị duy nhất bằng cách sử
dụng phép toán max hoặc min, tùy thuộc vào việc các phần được kết nối bằng OR
hay AND. Trong Hình 3.25, tất cả các phần của tiền mã được kết nối bằng AND,
vì vậy hoạt động tối thiểu được sử dụng xuyên suốt. Số lượng các phần của tiền
thức và loại toán tử logic được sử dụng để kết nối chúng có thể khác nhau giữa các
quy tắc.
3. Áp dụng phương pháp hàm ý: Đầu ra đơn lẻ của tiền đề của mỗi quy tắc được sử
dụng để cung cấp đầu ra tương ứng với quy tắc đó. Như đã giải thích trước đó,
phương pháp hàm ý mà chúng ta đang sử dụng dựa trên AND, là các phép toán tối
thiểu. Điều này cắt chức năng thành viên đầu ra tương ứng ở giá trị được cung cấp
bởi tiền thức, như cột thứ ba và thứ tư trong Hình 3.25 cho thấy.
4. Áp dụng phương pháp tổng hợp cho các tập mờ từ bước 3: Như cột cuối cùng
trong Hình 3.25 cho thấy, đầu ra của mỗi quy tắc là một tập mờ. Chúng phải được
kết hợp để tạo ra một tập mờ đầu ra duy nhất. Cách tiếp cận được sử dụng ở đây là
tạo thành liên hiệp (OR) của các đầu ra riêng lẻ, do đó hoạt động tối đa được sử
dụng.
5. Khử mờ tập mờ đầu ra cuối cùng: Trong bước cuối cùng này, chúng ta có được
một đầu ra vô hướng, sắc nét. Điều này đạt được bằng cách tính toán trọng tâm của
tập hợp tổng hợp từ bước 4.
Khi số lượng biến lớn, sẽ có lợi khi sử dụng ký hiệu viết tắt (biến, tập mờ) để ghép
một biến với hàm liên thuộc tương ứng của nó. Ví dụ: quy tắc "NẾU giá trị tần số
thấp, hoạt động của động cơ THEN là bình thường" sẽ được viết là: "IF (z, thấp)
THEN (v, bình thường)" trong đó, như trước các biến z và v đại diện cho tần số
trung bình và phần trăm bất thường, tương ứng, trong khi thấp và bình thường
được xác định bởi hai hàm liên thuộc µlow, (z) và µnorm (v), tương ứng.
Nói chung, khi làm việc với M quy tắc if-then, N biến đầu vào, z,, z2, ..., zN và
một biến đầu ra, v, kiểu công thức quy tắc mờ được sử dụng thường xuyên nhất
trong xử lý ảnh có dạng

trong đó Aij là tập mờ được liên kết với quy tắc thứ i và biến đầu vào thứ j, Bi là
tập mờ được liên kết với đầu ra của quy tắc thứ i và chúng ta đã giả định rằng các
thành phần của tiền đề quy tắc được liên kết bởi AND. Lưu ý rằng chúng tôi đã
giới thiệu quy tắc ELSE, với tập mờ liên quan BE. Quy tắc này được thực thi khi
không có quy tắc nào trước đó được thỏa mãn hoàn toàn; đầu ra của nó được giải
thích bên dưới.
Như đã chỉ ra trước đó, tất cả các phần tử của tiền thức của mỗi quy tắc được đánh
giá để mang lại một giá trị vô hướng duy nhất. Trong Hình 3.25, chúng tôi sử dụng
phép toán min vì các quy tắc dựa trên AND. Công thức tổng quát trước đó cũng sử
dụng AND, vì vậy chúng ta sử dụng lại toán tử min. Đánh giá các tiền thân của quy
tắc thứ i tạo ra một đầu ra vô hướng, λi, được đưa ra bởi

cho i = 1, 2,. .., M, trong đó µ Aij (zj) là hàm liên thuộc của tập mờ Aij được đánh
giá tại giá trị của đầu vào thứ j. Thông thường, λi được gọi là cấp độ bền (hoặc cấp
độ bắn) của quy tắc thứ i. Chúng tôi biết từ cuộc thảo luận trước đó của chúng tôi
rằng A; chỉ đơn giản là giá trị được sử dụng để cắt chức năng đầu ra của quy tắc
thứ i.
Quy tắc ELSE được thực thi khi các điều kiện của quy tắc THEN là thỏa mãn yếu
(chúng tôi đưa ra trong Phần 3.6.6 một ví dụ chi tiết về cách sử dụng các quy tắc
ELSE). Phản hồi ELSE phải mạnh khi tất cả các phản hồi khác đều yếu. Theo một
nghĩa nào đó, bạn có thể xem quy tắc ELSE như là thực hiện một hoạt động
KHÔNG đối với kết quả của các quy tắc khác. Chúng tôi biết từ Phần 3.6.2 rằng
Sau đó, sử dụng ý tưởng này trong việc kết hợp (ANDing) tất cả các cấp của quy
tắc THEN, đưa ra mức độ mạnh sau cho quy tắc ELSE:

Chúng ta thấy rằng nếu tất cả các quy tắc THEN kích hoạt ở "cường độ đầy đủ"
(tất cả các phản hồi của chúng là 1) thì phản hồi của quy tắc ELSE là 0, như mong
đợi. Khi các phản hồi của quy tắc THEN yếu đi, độ mạnh của quy tắc ELSE sẽ
tăng lên. Đây là bản sao của quy tắc if-then-else quen thuộc được sử dụng trong lập
trình phần mềm.
Khi xử lý các OR trong tiền đề, chúng ta chỉ cần thay thế các AND trong công thức
chung được đưa ra trước đó bằng OR và min trong phương trình cho λi để a tối đa;
biểu thức cho λE không thay đổi. Mặc dù chúng tôi có thể tạo ra các tiền đề và hậu
quả phức tạp hơn những công thức được thảo luận ở đây, nhưng các công thức mà
chúng tôi đã phát triển chỉ sử dụng AND hoặc OR khá chung chung và được sử
dụng trong nhiều ứng dụng xử lý hình ảnh. Việc thực hiện các phương pháp mờ có
xu hướng chuyên sâu về mặt tính toán, vì vậy các công thức mờ cần được giữ càng
đơn giản càng tốt.
3.6.4 Tập hợp các hàm M mờ tùy chỉnh
Trong phần này, chúng tôi phát triển một tập hợp các hàm M thực hiện tất cả các
hàm liên thuộc trong Bảng 3.6 và tổng quát hóa mô hình được tóm tắt trong Hình
3.25. Do đó, các hàm này có thể được sử dụng làm cơ sở cho việc thiết kế một lớp
rộng các hệ thống mờ dựa trên quy tắc. Sau đó trong phần này, chúng tôi sử dụng
các chức năng này để tính toán đầu ra của hệ thống giám sát động cơ đã được thảo
luận trong phần trước. Sau đó, trong Phần 3.6.5 và 3.6.6, chúng tôi minh họa cách
mở rộng chức năng của các hàm bằng cách áp dụng chúng cho các phép biến đổi
cường độ mờ và lọc không gian.
Các hàm lồng nhau của MATLAB
Chúng tôi sử dụng các hàm lồng nhau một cách rộng rãi trong các phần sau, vì vậy
chúng tôi sẽ tìm hiểu sơ qua về khái niệm quan trọng này. Các hàm lồng nhau là
một tính năng lập trình tương đối mới được giới thiệu trong MATLAB 7. Trong
ngữ cảnh của phần này, mối quan tâm của chúng tôi đối với các hàm lồng nhau là
việc xây dựng các hàm tạo hàm, như bạn sẽ thấy ngay sau đây, rất phù hợp với các
loại hàm dùng trong xử lý mờ.
Một hàm lồng nhau là một hàm được định nghĩa trong phần thân của một hàm
khác. Khi tệp M chứa các hàm lồng nhau, tất cả các hàm trong tệp phải được kết
thúc bằng từ khóa end. Ví dụ: một hàm chứa một hàm lồng nhau có cú pháp chung
sau:

Một biến được sử dụng hoặc được định nghĩa trong một hàm lồng nhau nằm trong
không gian làm việc của hàm ngoài cùng, cả hai đều chứa hàm lồng nhau và truy
cập vào biến đó. Ví dụ

Biến điều chỉnh_income xuất hiện trong e_tax hàm lồng nhau tính toán và nó cũng
xuất hiện trong thuế hàm đi kèm. Do đó, cả hai trường hợp của Adjust_income đều
tham chiếu đến cùng một biến.
Khi bạn tạo một xử lý cho một hàm lồng nhau, không gian làm việc của các biến
của hàm đó được hợp nhất vào xử lý và các biến không gian làm việc tiếp tục tồn
tại miễn là xử lý hàm tồn tại. Hàm ý là các hàm xử lý có thể được tạo ra để có thể
truy cập và sửa đổi nội dung của không gian làm việc của riêng chúng. Tính năng
này cho phép tạo ra các chức năng tạo chức năng (còn gọi là nhà máy chức năng).
Ví dụ: MATLAB đi kèm với một hàm demo làm cho một hàm có khả năng xác
định số lần nó đã được gọi:
Đầu ra từ makecounter là một hàm xử lý tới hàm getCounter lồng nhau. Bất cứ khi
nào nó được gọi, hàm xử lý này có thể truy cập không gian làm việc biến của
getCounter, bao gồm cả biến currentCount. Khi được gọi, getCounter tăng biến này
và sau đó trả về giá trị của nó. Ví dụ,

Như đúng với bất kỳ ngôn ngữ nào hỗ trợ lời gọi hàm đệ quy, các lệnh gọi riêng
biệt đến một hàm trong MATLAB dẫn đến các trường hợp riêng biệt của các biến
của hàm đó. Điều này có nghĩa là một hàm tạo hàm, khi được gọi nhiều lần, sẽ tạo
ra các hàm có trạng thái độc lập. Ví dụ: bạn có thể tạo nhiều hơn một hàm bộ đếm,
mỗi hàm duy trì một bộ đếm độc lập với các hàm khác:
Một số hàm mờ mà chúng tôi phát triển ở phần sau trong phần này chấp nhận một
bộ hàm làm đầu vào và tạo ra một bộ hàm khác làm đầu ra. Đoạn mã sau giới thiệu
khái niệm này:

trong đó f và g là các hàm xử lý. Hàm soạn thảo lấy hai xử lý này làm đầu vào và
trả về một xử lý hàm mới, h, là thành phần của chúng, được định nghĩa trong
trường hợp này là h (x) = f (g (x)). Ví dụ, hãy xem xét những điều sau:

kết quả là hàm h (x) = sin (1. / x). Làm việc với hàm mới xử lý h cũng giống như
làm việc với sin (1. / X). Ví dụ, để vẽ biểu đồ hàm này trong khoảng [-1, 1], chúng
tôi viết
>> fplot (h, [ - 1 1], 20) % See Sect ion 3.3.1 regarding fplot .
Chúng tôi sử dụng các ý tưởng vừa được giới thiệu ở phần sau của phần này, bắt
đầu với hàm lambdafcns.
Membership functions
Các hàm số M sau đây là tự giải. Chúng thực hiện trực tiếp các phương trình của
các hàm liên thuộc trong Bảng 3.6. Trên thực tế, các ô trong bảng đó được tạo
bằng các hàm này. Quan sát rằng tất cả các hàm đều được vector hóa, theo nghĩa là
biến độc lập, z, có thể là một vector có độ dài bất kỳ.
Chức năng cho các cường độ quy tắc tính toán
Khi các hàm liên thuộc đầu vào và đầu ra đã được xác định bằng cách sử dụng bất
kỳ hàm M nào trước đó, bước tiếp theo là đánh giá các quy tắc cho bất kỳ đầu vào
nhất định nào. Đó là, chúng tôi tính toán độ mạnh của quy tắc (các hàm lambda
được xác định trong phần trước), là việc thực hiện hai bước đầu tiên trong quy
trình được nêu trong Phần 3.6.3. Hàm sau, lambdafcns, thực hiện tác vụ này. Quan
sát rằng việc sử dụng các hàm lồng nhau cho phép lambdafcns xuất ra một tập hợp
các hàm lambda thay vì đầu ra số. Chúng tôi có thể, vì ví dụ, vẽ các kết quả đầu ra
của hàm. Một phép loại suy từ toán học là viết một tập hợp các phương trình dưới
dạng các biến thay vì các giá trị cụ thể. Khả năng này sẽ khó thực hiện nếu không
có các hàm lồng nhau
Chức năng thực hiện các hàm ý
Hàm ý là bước tiếp theo trong quy trình được nêu trong Phần 3.6.3. Hàm ý yêu cầu
phản hồi cụ thể của từng quy tắc và một tập hợp các hàm thành viên đầu ra tương
ứng. Đầu ra của hàm lambdafcns cung cấp độ mạnh của quy tắc trong các thuật
ngữ "chung". Ở đây chúng ta cần cung cấp các đầu vào cụ thể để có thể thực hiện
hàm ý. Hàm sau đây sử dụng các hàm lồng nhau để tạo ra các hàm ngụ ý cần thiết.
Như trước đây, việc sử dụng các hàm lồng nhau cho phép tạo ra chính các hàm ngụ
ý (xem cột thứ tư trong Hình 3.25).
Chức năng thực hiện tổng hợp
Bước tiếp theo trong quy trình của chúng tôi là tổng hợp các hàm sinh ra từ hàm ý.
Một lần nữa, việc sử dụng các hàm lồng nhau cho phép chúng ta viết mã xuất ra
chính hàm tổng hợp (xem hàm ở cuối cột thứ tư trong Hình 3.25).

Chức năng để thực hiện giải mờ


Đầu ra của aggfcn là một hàm mờ. Để có được đầu ra cuối cùng, sắc nét, chúng tôi
thực hiện giải mờ, như đã giải thích trong Phần 3.6.3. Hàm sau thực hiện điều này.
Lưu ý rằng đầu ra trong trường hợp này là một giá trị số, trái ngược với đầu ra của
lambdaf cns, impl f ens, và aggfcn, là các hàm. Cũng lưu ý rằng không cần hàm
lồng nhau ở đây.
Để tất cả chúng cùng nhau
Hàm sau kết hợp các hàm mờ trước thành một tệp M duy nhất chấp nhận một tập
hợp các hàm liên thuộc đầu vào và đầu ra và tạo ra một hàm hệ mờ duy nhất có thể
được đánh giá cho bất kỳ tập hợp đầu vào nào. Nói cách khác, hàm sau đây tổng
quát hóa và tích hợp toàn bộ quá trình được tóm tắt trong Hình 3.25. Như bạn sẽ
thấy trong Ví dụ 3.14 và trong Phần 3.6.5 và 3.6.6, nỗ lực cần thiết để thiết kế một
hệ mờ được giảm đáng kể bằng cách sử dụng chức năng này.
Cải thiện hiệu suất
Hàm hệ thống mờ được tạo bởi fu zzysysfcn cung cấp đầu ra chính xác cho bất kỳ
tập hợp đầu vào nào. Mặc dù nó hữu ích cho các mục đích thăm dò và vẽ biểu đồ,
nhưng nó quá chậm đối với các đầu vào lớn, như thường thấy trong xử lý ảnh.
Hàm xấp xỉ tạo ra một xấp xỉ cho hàm hệ mờ. Phép tính gần đúng sử dụng bảng tra
cứu và chạy nhanh hơn nhiều.
Khi một hàm mất hơn vài giây để thực thi, cách tốt là cung cấp tín hiệu trực quan
cho người dùng, cho biết phần trăm hoàn thành. Chức năng Wa tbar của MATLAB
được sử dụng cho mục đích đó. Cú pháp
h = wai tbar ( c, ' message ' )
hiển thị thanh chờ có độ dài phân số c, trong đó c nằm trong khoảng từ 0 đến 1.
Một ứng dụng điển hình (là ứng dụng mà chúng tôi sử dụng ở đây) là đặt thanh chờ
bên trong vòng lặp for thực hiện tính toán dài dòng. Đoạn mã sau minh họa cách
thực hiện điều này:
Chi phí tính toán vốn có trong việc cập nhật thanh trong mỗi lần đi qua một vòng
lặp có thể được giảm bớt bằng cách cập nhật thanh định kỳ. Phần sau sửa đổi đoạn
mã trước đó để cập nhật thanh ở các khoảng thời gian 2%:
Trong ví dụ này, chúng tôi sử dụng các hàm mờ để tính toán phần trăm bất thường
hoạt động của ví dụ về động cơ dựa trên các hàm trong Hình.3.22-3.24. Đầu tiên,
chúng tôi chứng minh việc sử dụng các hàm riêng lẻ và sau đó chúng tôi nhận
được giải pháp trong một bước bằng cách sử dụng hàm fuzzysysfcn.
Chúng ta bắt đầu bằng cách tạo các chốt cho các hàm thành viên đầu vào trong
Hình.3.22:

Các hàm này tương ứng với các đồ thị trong Hình 3.22 (a) (lưu ý cách chúng tôi sử
dụng 1 - sigmamf để tạo ra hàm ngoài cùng bên trái trong hình đó). Bạn có thể hiển
thị sơ đồ của các hàm này bằng cách nhập:
Tương tự, ba hàm đầu ra sau đây tương ứng với các ô trong Hình 3.23.

Tiếp theo, chúng ta sắp xếp các chốt của hàm thành viên đầu vào trong một mảng ô
và thu được độ mạnh của quy tắc. Lưu ý việc sử dụng dấu chấm phẩy trong các
quy tắc mảng vì lambdafcns mong đợi mỗi hàng của mảng chứa các hàm thành
viên được liên kết với quy tắc đó (trong trường hợp này chỉ có một hàm thành viên
đầu vào cho mỗi quy tắc):

Để tạo ra kết quả của hàm ý, chúng ta cần L. ba hàm đầu ra được xây dựng trước
đó và một giá trị cụ thể của z (là hàm vô hướng, vì chỉ có một giá trị đầu vào trong
trường hợp này):

Bước tiếp theo là tổng hợp:


>> Qa = aggfcn (Q) ;
và bước cuối cùng là làm mờ:

là 76% bất thường được thảo luận liên quan đến Hình 3.24. Sử dụng hàm
fuzzysysfcn mang lại kết quả tương tự, như mong đợi:

Sử dụng hàm xấp xỉ


cho cùng một kết quả. Trên thực tế, nếu chúng ta vẽ hai hàm

bạn có thể thấy trong Hình 3.26 rằng hai phản ứng của hệ thống mờ giống hệt nhau
cho tất cả các mục đích thực tế
Để đánh giá lợi thế về thời gian giữa hai lần triển khai, chúng tôi sử dụng hàm thời
gian từ Phần 2.10.5:

vì vậy hàm xấp xỉ chạy nhanh hơn gần mười lần trong trường hợp này.
3.6.5 Sử dụng bộ mờ để biến đổi cường độ
Tăng cường độ tương phản, một trong những ứng dụng chính của phép biến đổi
cường độ, có thể được thể hiện theo các quy tắc sau

IF a pixel is dark, THEN make it darker


IF a pixel is gray, THEN make it gray
IF a pixel is bright, THEN make it brighter
Nếu chúng ta coi các thuật ngữ in nghiêng là mờ, chúng ta có thể biểu thị các khái
niệm về bóng tối, xám và sáng, bằng các hàm liên thuộc trong Hình 3.27 (a). Đối
với đầu ra, làm cho cường độ tối hơn và sáng hơn có nghĩa là tăng sự tách biệt của
tối và sáng trên thang màu xám, làm tăng độ tương phản. Thông thường, việc thu
hẹp khoảng giữa màu xám sẽ làm tăng độ "phong phú" của hình ảnh. Hình 3.27 (b)
cho thấy một tập hợp các hàm thành viên đầu ra để thực hiện các mục tiêu này.
Hình 3.28 (a) cho thấy một hình ảnh, f, có cường độ trải dài trong một phạm vi hẹp
của thang màu xám, như biểu đồ trong Hình 3.29 (a) (thu được bằng cách sử dụng
imhist) cho thấy. Kết quả thực là một hình ảnh có độ tương phản thấp.
Hình 3.28 (b) là kết quả của việc sử dụng cân bằng biểu đồ để tăng độ tương phản
của hình ảnh. Như biểu đồ trong Hình 3.29 (b) cho thấy, toàn bộ thang màu xám đã
được trải rộng nhưng trong trường hợp này, sự lan rộng quá mức có nghĩa là độ
tương phản được tăng lên, nhưng kết quả là một hình ảnh có vẻ ngoài "quá phơi
sáng" . Ví dụ, các chi tiết trên trán và tóc của Giáo sư Einstein đã bị mất gần hết.
Hình 3.28 (c) cho thấy kết quả của các phép toán mờ sau:
Như bạn có thể thấy trong Hình 3.28 (c) kết quả của các thao tác làm mờ trước đó
là một hình ảnh có độ tương phản tăng và tông màu xám phong phú. Lưu ý, ví dụ,
tóc và trán, so với các vùng giống nhau trong Hình 3.28 (b). Lý do của sự cải tiến
có thể được giải thích dễ dàng bằng cách nghiên cứu biểu đồ của Hình 3.28 (c),
được thể hiện trong Hình 3.29 (c). Không giống như biểu đồ của hình ảnh cân
bằng, biểu đồ này đã giữ các đặc điểm cơ bản giống như biểu đồ của
ảnh gốc. Tuy nhiên, khá rõ ràng là các mức tối (đỉnh cao ở phần cuối thấp của biểu
đồ) đã bị di chuyển sang trái, do đó làm tối các mức. Điều ngược lại đã đúng với
các mức sáng. Các màu xám ở giữa được dàn trải một chút, nhưng Jess nhiều hơn
so với sự cân bằng biểu đồ. Cái giá của việc cải thiện chất lượng hình ảnh này là độ
phức tạp của quá trình xử lý tăng lên. Một cách tiếp cận thực tế cần tuân theo khi
tốc độ xử lý và thông lượng hình ảnh là những cân nhắc quan trọng là sử dụng kỹ
thuật mờ để xác định biểu đồ của hình ảnh cân bằng tốt trông như thế nào. Sau đó,
các kỹ thuật nhanh hơn, chẳng hạn như đặc tả biểu đồ, có thể được sử dụng để đạt
được kết quả tương tự bằng cách ánh xạ biểu đồ của các hình ảnh đầu vào với một
hoặc nhiều biểu đồ "lý tưởng" được xác định bằng cách tiếp cận mờ.
3.6.6 Sử dụng bộ mờ để lọc không gian
Khi sử dụng các tập mờ để lọc không gian, cách tiếp cận cơ bản là xác định các
thuộc tính vùng lân cận mờ để "nắm bắt" bản chất của những gì mà các bộ lọc phải
phát hiện. Ví dụ Fro, chúng ta có thể phát triển một thuật toán phát hiện ranh giới
mờ (nâng cao) dựa trên câu lệnh mờ sau:
If a pixel belongs to a uniform region, then make it white; else make it black
trong đó đen và trắng là các biến mờ. Để thể hiện khái niệm "vùng đồng nhất"
trong thuật ngữ mờ, chúng ta có thể xem xét sự khác biệt về cường độ giữa pixel ở
trung tâm của vùng lân cận và các vùng lân cận của nó. Đối với vùng lân cận 3 x 3
trong Hình 3.30 (a), sự khác biệt giữa pixel trung tâm (có nhãn z5) và mỗi vùng lân
cận tạo thành hình ảnh con có kích thước 3 X 3 trong Hình 3.30 (b), trong đó di
biểu thị cường độ hiệu giữa lân cận thứ i và điểm trung tâm (tức là, di = Z1 - z5,
trong đó z là giá trị cường độ). Bốn quy tắc IF-THEN và một quy tắc ELSE triển
khai câu lệnh mờ vừa được đề cập:

trong đó số không cũng mờ. Hệ quả của mỗi quy tắc xác định các giá trị mà cường
độ của điểm ảnh trung tâm (z5) được ánh xạ. Đó là, câu lệnh "THEN Z5 is white"
có nghĩa là cường độ của pixel nằm ở trung tâm của vùng lân cận được ánh xạ
thành màu trắng. Các quy tắc này nói rằng pixel trung tâm được coi là một phần
của vùng đồng nhất nếu sự khác biệt về cường độ vừa được đề cập bằng 0 (theo
nghĩa mờ); nếu không (ELSE) nó được coi là pixel (ranh giới) màu đen.

Hình 3.31 (a) cho thấy hàm liên thuộc cho không, là hàm liên thuộc đầu vào và
Hình 3.3l (b) cho thấy các hàm liên thuộc đầu ra tương ứng là màu đen và trắng,
trong đó chúng tôi sử dụng ZE, BL và WH để đơn giản hóa ký hiệu. Lưu ý rằng
phạm vi của biến độc lập của tập mờ ZE đối với ảnh có L mức cường độ có thể là
[-L + 1, L - 1] vì sự khác biệt về cường độ có thể nằm trong khoảng - (L - 1) và L -
1. Bật mặt khác, phạm vi của cường độ đầu ra là [0, L - 1], như trong hình ảnh gốc.
Hình 3.32 cho thấy bằng đồ thị các quy tắc được nêu ở trên, trong đó hộp có nhãn
z5 cho biết cường độ của pixel trung tâm được ánh xạ tới giá trị đầu ra WH hoặc
BL.
Lọc mờ dựa trên các khái niệm trước đây có hai phần cơ bản: xây dựng hệ thống
lọc mờ và tính toán chênh lệch cường độ trên toàn bộ ảnh. Việc triển khai được
thực hiện theo mô-đun nếu chúng ta xử lý hai phần này riêng biệt, điều này sẽ cho
phép thay đổi cách tiếp cận mờ mà không ảnh hưởng đến mã tính toán sự khác
biệt. Cách tiếp cận trong cuộc thảo luận sau đây là (1) tạo một tập lệnh thực thi hệ
thống mờ và lưu nó dưới dạng tệp MAT; và (2) thực hiện một chức năng lọc riêng
biệt để tính toán các khác biệt và sau đó tải hệ thống mờ để đánh giá các khác biệt
đó.
Trước tiên, chúng tôi phát triển tập lệnh mà chúng tôi gọi là makefuzzyedgesys.
Lưu ý trong mã tập lệnh rằng, bởi vì không phải tất cả các đầu vào đều được liên
kết với mỗi đầu ra, chúng tôi xác định quy tắc đầu vào của các đầu vào (mà chúng
tôi gọi là not_used) để chỉ định quy tắc nào không được sử dụng cho đầu ra nhất
định (nhớ lại rằng chúng tôi đang sử dụng phép toán min trong mô hình của Hình
3.25, vì vậy một hàm liên thuộc đầu vào có giá trị 1, là giá trị lớn nhất có thể,
không ảnh hưởng đến đầu ra). Cũng lưu ý trong mã rằng, vì chúng ta có bốn quy
tắc và bốn đầu vào, ma trận quy tắc có kích thước 4 x 4, như đã giải thích trước đó
trong hàm lambdafcns. Trong trường hợp hiện tại, đầu vào đầu tiên là d2, đầu vào
thứ hai là d4, đầu vào thứ ba là d6 và đầu vào thứ tư là d8, và mỗi đầu vào đều có
hàm liên thuộc bằng không. Sau đó, ví dụ, hàng đầu tiên của ma trận quy tắc
(tương ứng với đầu ra đầu tiên) là: zero, not_used, zero, not_used. Nghĩa là, chỉ
đầu vào thứ nhất và thứ ba được sử dụng trong quy tắc đầu tiên.
đầu vào đầu tiên và thứ ba được sử dụng trong quy tắc đầu tiên. Bởi vì các phép
toán mờ này được áp dụng tại mọi vị trí trong ảnh, đây là một quá trình tính toán
chuyên sâu, vì vậy chúng tôi thu được giá trị gần đúng cho hệ thống mờ bằng cách
sử dụng hàm xấp xỉ để giảm thời gian xử lý, như đã thảo luận trước đó. Bởi vì
chúng tôi quan tâm đến việc chỉ lưu xấp xỉ hệ thống mờ (được gọi là G trong mã)
trong tệp MAT, chúng tôi sử dụng cú pháp sau cho hàm lưu:

Việc triển khai một hàm tính toán sự khác biệt rất đơn giản. Đặc biệt lưu ý cách
tính toán các khác biệt này được thực hiện bằng cách sử dụng imfilter và cũng như
cách hàm hệ mờ G được đánh giá với tất cả các khác biệt cùng một lúc, cho thấy
lợi thế của việc triển khai vectơ đã được sử dụng trong việc phát triển các hàm mờ.
Khi tải hàm được gọi với một đối số đầu ra, tải trả về một cấu trúc. Do đó, lệnh
s = load ( makefu zzyedges)
trả về s. G, (cấu trúc s với trường có tên G) vì tệp MAT makefuzzyedges đã được
lưu với nội dung G, như đã giải thích trước đó.

VÍ DỤ 3.16: Phát hiện ranh giới bằng cách sử dụng lọc không gian dựa trên quy
tắc, mờ.
• Hình 3.33 (a) cho thấy hình chụp CT 5 12 X 512 của đầu người, và Hình 3.33 (b)
là kết quả của việc sử dụng phương pháp lọc không gian mờ vừa thảo luận. Lưu ý
hiệu quả của phương pháp trong việc trích xuất ranh giới giữa các vùng, bao gồm
cả đường viền của não (vùng xám bên trong).
Các vùng không đổi trong hình ảnh có màu xám bởi vì, khi sự khác biệt về cường
độ được thảo luận trước đó gần bằng 0, các quy tắc THEN có phản ứng mạnh.
Những phản hồi này lần lượt có chức năng clip WH. Đầu ra (trọng tâm của các
vùng hình tam giác bị cắt) là một hằng số giữa (L - 1) / 2 và L - 1, do đó tạo ra tông
màu xám được nhìn thấy trong hình ảnh. Độ tương phản của hình ảnh này có thể
được cải thiện đáng kể bằng cách mở rộng thang màu xám. Ví dụ, Hình 3.33 (c)
thu được bằng cách thực hiện chia tỷ lệ cường độ sử dụng tia mat2g hàm. Kết quả
thực là các giá trị cường độ trong Hình 3.33 (c) kéo dài toàn thang màu xám.

Tóm lược
Tài liệu trong chương này là nền tảng cho nhiều chủ đề mà bạn sẽ gặp trong các
chương tiếp theo. Ví dụ: chúng tôi sử dụng xử lý không gian trong Chương 5 liên
quan đến khôi phục hình ảnh, nơi chúng tôi cũng xem xét kỹ hơn các chức năng
giảm nhiễu và tạo nhiễu trong MATLAB. Một số mặt nạ không gian đã được đề
cập ngắn gọn ở đây được sử dụng rộng rãi trong Chương 11 để phát hiện cạnh
trong các ứng dụng phân đoạn. Các khái niệm về tích chập và tương quan được
giải thích lại trong Chương 4 từ quan điểm của miền tần số. Về mặt khái niệm, xử
lý vùng lân cận và việc triển khai các bộ lọc không gian sẽ xuất hiện trong các
cuộc thảo luận khác nhau trong suốt cuốn sách. Trong quá trình này, chúng tôi sẽ
mở rộng nhiều cuộc thảo luận bắt đầu ở đây và giới thiệu các khía cạnh bổ sung về
cách các bộ lọc không gian có thể được triển khai hiệu quả trong MATLAB.
Chương 4: lọc trong miền tần số
Xem trước
Đối với hầu hết các phần, chương này song song với các chủ đề lọc được thảo luận
trong Chương 3, nhưng với tất cả việc lọc được thực hiện trong miền tần số thông
qua phép biến đổi Fourier. Ngoài vai trò là nền tảng của lọc tuyến tính, biến đổi
Fourier cung cấp tính linh hoạt đáng kể trong việc thiết kế và triển khai các giải
pháp lọc trong các lĩnh vực như nâng cao hình ảnh, khôi phục hình ảnh, nén dữ liệu
hình ảnh và một loạt các ứng dụng quan tâm thực tế khác. Trong chương này, trọng
tâm là nền tảng của cách thực hiện lọc miền tần số trong MATLAB. Như trong
Chương 3, chúng tôi minh họa việc lọc trong miền tần số với các ví dụ về nâng cao
hình ảnh, bao gồm lọc thông thấp để làm mịn hình ảnh, lọc thông cao (bao gồm lọc
nhấn mạnh tần số cao) để làm sắc nét hình ảnh và lọc chọn lọc để loại bỏ nhiễu
định kỳ. Chúng tôi cũng trình bày ngắn gọn cách xử lý miền tần số và không gian
có thể được sử dụng kết hợp để mang lại kết quả vượt trội hơn so với việc sử dụng
một trong hai loại xử lý. Mặc dù hầu hết các ví dụ trong chương này đề cập đến
việc nâng cao hình ảnh, các khái niệm và kỹ thuật được phát triển trong các phần
sau là khá chung chung, như được minh họa bởi các ứng dụng khác của tài liệu này
trong các Chương 5, 9 và 11, 12 và 13.
4.1 Biến đổi Fourier rời rạc 2-D
Đặt f (x, y) với x = 0, 1, 2, ..., M - 1 và y = 0, 1, 2, ..., N - 1 biểu thị ảnh kỹ thuật số
có kích thước M X N pixel. Biến đổi Fourier rời rạc 2-D (OFT) của f (x, y), ký
hiệu là F (u, v), được cho bởi phương trình

cho u = 0, 1, 2, ..., M -1 và v = 0, 1, 2, ..., N - 1. Chúng ta có thể mở rộng hàm mũ


thành các hàm sin và côsin, với các biến u và v xác định tần số của chúng (x và y
được tính bằng tổng). Miền tần số là hệ tọa độ được kéo dài bởi F (u, v) với u và v
là các biến (tần số). Điều này tương tự với miền không gian được nghiên cứu trong
Chương 3, là hệ tọa độ được kéo dài bởi f (x, y), với x và y là các biến (không
gian). M x N vùng hình chữ nhật được xác định bởi u = 0, 1, 2, ..., M - 1 và v = 0,
1, 2 ,. . . , N - 1 thường được gọi là hình chữ nhật tần số. Rõ ràng, hình chữ nhật tần
số có cùng kích thước với hình ảnh đầu vào.
Biến đổi Fourier ngược, rời rạc (IDFf) được cho bởi
với x = 0, 1, 2, ..., M - 1 và y = 0, 1, 2, ..., N - 1. Do đó, với F (u, v), ta có thể thu
được f (x, y) quay lại bằng IDFf. Các giá trị của F (u, v) trong phương trình này đôi
khi được gọi là hệ số Fourier của khai triển
Trong một số công thức của DFf, số hạng 1 / MN xuất hiện trước phép biến hình
và trong những công thức khác, số hạng này được sử dụng ở phía trước phép
nghịch đảo. Việc triển khai MATLAB sử dụng thuật ngữ ở phía trước nghịch đảo,
như trong phương trình trước. Bởi vì chỉ số mảng trong MATLAB bắt đầu bằng 1
thay vì 0, F (1, 1) và f (1, 1) trong MATLAB tương ứng với các đại lượng toán học
F (0,0) và f (0, 0) trong phép biến đổi và nghịch đảo. Nói chung F (i, j) = F (i - 1, j
- 1) và f (i, j) = f (i - l, j - 1) với i = 1, 2, ..., M và j = 1, 2, ..., N.
Giá trị của phép biến đổi tại gốc của miền tần số [tức là F (0, 0)] được gọi là thành
phần de của phép biến đổi Fourier. Thuật ngữ này là từ kỹ thuật điện, trong đó "de"
biểu thị dòng điện một chiều (dòng điện có tần số bằng không). Không khó để
chứng minh rằng F (0, 0) bằng MN nhân với giá trị trung bình của f (x, y).
Ngay cả khi f (x, y) là một hàm thực thì phép biến đổi của nó nói chung là phức
tạp. Phương pháp chính để phân tích một phép biến đổi một cách trực quan là tính
toán phổ của nó [tức là độ lớn của F (u, v), là một hàm thực] và hiển thị nó dưới
dạng hình ảnh. Đặt R (u, v) và J (u, v) đại diện cho các thành phần thực và ảo của F
(u, v), phổ Fourier được định nghĩa là

Góc pha của phép biến hình được xác định là

Hai hàm này có thể được sử dụng để biểu diễn hàm phức F (u, v) ở dạng cực:

Quang phổ công suất được định nghĩa là bình phương của độ lớn:
Đối với mục đích hình dung, nó thường là phi vật chất cho dù chúng ta xem |F (u,
v)| I hay P (u, v).
Nếu f (x, y) là thực, thì biến đổi Fourier của nó là đối xứng liên hợp về gốc; đó là,

Điều này ngụ ý rằng phổ Fourier cũng đối xứng về điểm gốc:

Nó có thể được chỉ ra bằng cách thay thế trực tiếp vào phương trình F (u, v) mà

trong đó k1 và k2 là các số nguyên. Nói cách khác, OFT là tuần hoàn vô hạn theo
cả hướng u và v, với chu kỳ được xác định bởi M và N. Tính tuần hoàn cũng là
một tính chất của OFT nghịch đảo:

Nghĩa là, một hình ảnh thu được bằng cách thực hiện phép biến đổi Fourier ngược
cũng tuần hoàn vô hạn. Đây là một nguồn thường xuyên gây nhầm lẫn bởi vì nó
hoàn toàn không trực quan tại sao hình ảnh thu được từ việc thực hiện phép biến
đổi Fourier ngược lại phải là tuần hoàn. Cần nhớ rằng đây chỉ đơn giản là một tính
chất toán học của OFT và nghịch đảo của nó. Cũng xin lưu ý rằng triển khai OFT
chỉ tính một khoảng thời gian, vì vậy chúng tôi làm việc với các mảng có kích
thước M X N.
Vấn đề tính chu kỳ trở nên quan trọng khi chúng ta xem xét cách dữ liệu OFT liên
quan đến các thời kỳ của quá trình biến đổi. Ví dụ, Hình 4.1 (a) cho thấy phổ của
một phép biến đổi một chiều, F (u). Trong trường hợp này, biểu thức tuần hoàn trở
thành F (u) = F (u + k1M), từ đó biểu thức đó | F (u) | = | F (u + k1M) |. Ngoài ra,
vì tính đối xứng, | F (u) | = | F (-u) |. Tính chất tuần hoàn cho biết F (u) có chu kỳ
bằng M, và tính chất đối xứng chỉ ra rằng | F (u) | được căn giữa vào điểm gốc, như
Hình 4.l (a) cho thấy. Hình này và các nhận xét trước chứng minh rằng các giá trị
của | F (u) | từ M / 2 đến M - 1 là sự lặp lại của các giá trị trong nửa chu kỳ ở bên
trái gốc tọa độ. Bởi vì OFT 1-0 chỉ được triển khai cho M điểm (tức là, đối với các
giá trị nguyên của u trong khoảng [0, M -1]), nên việc tính toán biến đổi 1-0 mang
lại hai nửa chu kỳ ngược nhau trong khoảng thời gian này. Chúng tôi quan tâm đến
việc có được một khoảng thời gian đầy đủ, được sắp xếp đúng trong khoảng [O, M
- I]. Không khó để chứng minh (Gonzalez và Woods [2008]) rằng chu kỳ mong
muốn thu được bằng cách nhân f (x) với (-1) 'trước khi tính toán biến đổi. Về cơ
bản, điều này làm là di chuyển điểm gốc của phép biến hình đến điểm u = M / 2,
như Hình 4.l (b) cho thấy. Bạn có thể thấy rằng giá trị của quang phổ tại u = 0
trong Hình 4.l (b) tương ứng với IF (-M / 2) 1 trong Hình 4.l (a). Tương tự, các giá
trị tại IF (M / 2) 1 và IF (M - 1) 1 trong Hình 4.l (b) tương ứng với IF (O) I và IF
(M / 2 - 1) 1 trong Hình 4 .l (a).

Một tình huống tương tự cũng tồn tại với các hàm hai chiều. Tính toán OFT 2-D
giờ đây tạo ra các điểm biến đổi trong khoảng hình chữ nhật được thể hiện trong
Hình 4.2 (a), trong đó vùng bóng mờ chỉ ra các giá trị của F (u, v) thu được bằng
cách thực hiện phương trình biến đổi Fourier 2-D được xác định ở đầu của phần
này. Các hình chữ nhật đứt nét là sự lặp lại theo chu kỳ, như trong Hình 4.l (a).
Vùng được tô bóng cho thấy rằng các giá trị của F (u, v) hiện bao gồm bốn chu kỳ
quý liên tiếp gặp nhau tại điểm được thể hiện trong Hình 4.2 (a). Phân tích trực
quan của quang phổ là đơn giản hóa bằng cách di chuyển các giá trị tại điểm gốc
của phép biến đổi vào tâm của hình chữ nhật tần số. Điều này có thể được thực
hiện bằng cách nhân f (x, y) với (-1) ^ (x + y) trước khi tính toán biến đổi Fourier
2-D. Các khoảng thời gian sau đó sẽ sắp xếp như trong Hình 4.2 (b). Giá trị của
phổ tại tọa độ (M / 2, N / 2) trong Hình 4.2 (b) giống với giá trị của nó tại (0, 0)
trong Hình 4.2 (a) và giá trị tại (0, 0) trong Hình 4.2 (b) giống với giá trị tại (-M /
2, -N / 2) trong Hình 4.2 (a). Tương tự, giá trị tại (M - 1, N - 1) trong Hình 4.2 (b)
giống với giá trị tại (M / 2 - 1, N / 2 - 1) trong Hình 4.2 (a).

Thảo luận trước đây về việc căn giữa phép biến đổi bằng cách nhân f (x, y) với (-1)
^ (x + y) là một khái niệm quan trọng được bao gồm ở đây để tính đầy đủ. Khi làm
việc trong MATLAB, cách tiếp cận là tính toán biến đổi không nhân với (-1) ^ (x +
y) và sau đó sắp xếp lại dữ liệu sau đó bằng cách sử dụng hàm fftshift, được thảo
luận trong phần sau.
4.2 Tính toán và hiển thị OFT 2-D trong MATLAB
OFT và nghịch đảo của nó thu được trong thực tế bằng cách sử dụng thuật toán
biến đổi Fourier nhanh (FFT). FFT của mảng hình ảnh f thu được trong MATLAB
bằng cách sử dụng hàm fft2, có cú pháp:
F = fft2 (f)
Hàm này trả về một phép biến đổi Fourier cũng có kích thước M X N, với dữ liệu
được sắp xếp theo dạng như trong Hình 4.2 (a); nghĩa là, với nguồn gốc của dữ liệu
ở trên cùng bên trái và với bốn phần tư thời gian gặp nhau ở tâm của hình chữ nhật
tần suất.
Như đã giải thích trong Phần 4.3.1, cần phải chèn hình ảnh đầu vào bằng các số
không khi phép biến đổi Fourier được sử dụng để lọc. Trong trường hợp này, cú
pháp trở thành
F = fft2 (f, P, Q)
Với cú pháp này, fft2 đánh dấu f bằng số lượng số không cần thiết để biến đổi kết
quả có kích thước P X Q.
Phổ Fourier thu được bằng cách sử dụng hàm abs
S = abs (F)
tính toán độ lớn (căn bậc hai của tổng bình phương của phần thực và phần ảo) của
mỗi phần tử của mảng.
Phân tích trực quan phổ bằng cách hiển thị nó dưới dạng hình ảnh là một khía cạnh
quan trọng của việc làm việc trong miền tần số. Như một minh họa, hãy xem xét
hình ảnh, f, trong Hình 4.3 (a). Chúng tôi tính toán biến đổi Fourier của nó và hiển
thị phổ bằng các lệnh sau:
Hình 4.3 (b) cho thấy kết quả. Bốn điểm sáng ở các góc của hình ảnh là kết quả
của tính chất tuần hoàn đã được đề cập trong phần trước.
Hàm fftshi ft có thể được sử dụng để di chuyển điểm gốc của phép biến đổi đến
tâm của hình chữ nhật tần số. Cú pháp là
Fc = fftshift (F)
trong đó F là phép biến đổi được tính bằng fft2 và Fe là phép biến đổi ở giữa. Hàm
fftshift hoạt động bằng cách hoán đổi các góc phần tư của F. Ví dụ, nếu a = [1 2; 3
4], thì fft shift (a) = [4 3; 2 1]. Khi được áp dụng cho phép biến đổi Fourie, kết quả
thực của việc sử dụng fftshi ft giống như khi hình ảnh đầu vào đã được nhân với (-
ly + y trước khi tính toán phép biến đổi. Tuy nhiên, lưu ý rằng hai quá trình này
không thể hoán đổi cho nhau. Điều đó nghĩa là, đặt L [.] biểu thị biến đổi Fourier
của đối số, chúng ta có rằng: L [((-1) ^ (x + y) + f (x, y)] bằng fftshift (fft2 (f)) ,
nhưng đại lượng này không bằng fft2 (fftshift (f)).
Trong ví dụ hiện tại, nhập

kết quả là Hình 4.3 (d). Sự gia tăng chi tiết hình ảnh là đáng kể.
Chức năng ifftshift đảo ngược căn giữa. Cú pháp của nó là
F = ifftshift (Fc)
Chức năng này cũng có thể được sử dụng để chuyển đổi một chức năng có tâm ban
đầu trên một hình chữ nhật thành một chức năng có tâm ở trên cùng, góc bên trái
của hình chữ nhật. Chúng tôi sử dụng thuộc tính này trong Phần 4.4.
Tiếp theo, chúng tôi xem xét tính toán của góc pha. Với tham chiếu đến thảo luận
trong phần trước, các thành phần thực và ảo của phép biến đổi Fourier 2-D, R (u,
v) và I (u, v), là các mảng có cùng kích thước với F (u, v). Bởi vì các phần tử của R
và I có thể dương và âm một cách độc lập, chúng ta cần có khả năng tính arctang
trong phạm vi [-π, π] đầy đủ (các hàm có đặc tính này được gọi là cung bốn góc
phần tư). Hàm atan2 của MATLAB thực hiện tính toán này. Cú pháp của nó là
phi = atan2 (I, R)
trong đó phi là một mảng có cùng kích thước với I và R. Các phần tử của phi là các
góc tính bằng radian trong khoảng [-π, π] được đo so với trục thực. Ví dụ: atan2 (1,
1), atan2 (1, - 1) và atan2 (-1, -1) lần lượt là 0,7854, 2,3562 và -2,3562 radian, hoặc
45 °, 135 ° và -135 ° . Trong thực tế, chúng ta sẽ viết biểu thức trước dưới dạng
>> phi = atan2 ( imag (F) , real(F ));
Thay vì trích xuất các thành phần thực và ảo của F, chúng ta có thể sử dụng trực
tiếp góc hàm
phi = angle (F)
Kết quả là như nhau. Với quang phổ và góc pha tương ứng của nó, chúng ta có thể
thu được DFf bằng cách sử dụng biểu thức

Hình 4.3 (e) cho thấy mảng phi đối với DFf của Hình 4.3 (a), được hiển thị dưới
dạng hình ảnh. Góc pha không được sử dụng để phân tích trực quan thường xuyên
như quang phổ bởi vì đại lượng trước đây không trực quan. Tuy nhiên, góc pha
cũng quan trọng không kém về mặt nội dung thông tin. Các thành phần của quang
phổ xác định biên độ của các hình sin kết hợp để tạo thành một hình ảnh. Pha
mang thông tin về sự dịch chuyển của các hình sin khác nhau liên quan đến nguồn
gốc của chúng. Do đó, trong khi quang phổ là một mảng mà các thành phần của nó
xác định cường độ của một hình ảnh, thì pha tương ứng là một mảng các góc mang
thông tin về vị trí của các đối tượng trong một hình ảnh. Ví dụ, nếu bạn dịch
chuyển hình chữ nhật khỏi vị trí được hiển thị trong Hình 4.3 (a), phổ của nó sẽ
giống với phổ trong Hình 4.3 (b); sự dịch chuyển của vật thể sẽ được phản ánh như
một sự thay đổi trong góc pha.
Trước khi rời khỏi chủ đề của DFf và định tâm của nó, hãy nhớ rằng tâm của hình
chữ nhật tần số nằm ở (M / 2, N / 2) nếu các biến u và v nằm trong khoảng từ 0 đến
M - 1 và N - 1, tương ứng. Ví dụ: tâm của hình vuông tần số 8 X 8 nằm ở điểm (4,
4) là điểm thứ 5 dọc theo mỗi trục, đếm lên từ (0, 0). Nếu như trong MATLAB,
các biến lần lượt chạy từ 1 đến M và 1 đến N, thì tâm của hình vuông là tại (M / 2
+ 1, N / 2 + 1). Tức là, trong ví dụ này, trung tâm sẽ ở điểm (5, 5), đếm lên từ (1,
1). Rõ ràng, hai trung tâm là cùng một điểm, nhưng đây có thể là một nguồn gây
nhầm lẫn khi quyết định cách xác định vị trí của các trung tâm DFf trong các tính
toán MATLAB.
Nếu M và N là số lẻ, trọng tâm của các phép tính MATLAB thu được bằng cách
làm tròn M / 2 và N / 2 xuống số nguyên gần nhất. Phần còn lại của phân tích như
trong đoạn trước. Ví dụ: trung tâm của vùng 7 X 7 ở (3, 3) nếu chúng ta đếm lên từ
(0, 0) và tại (4, 4) nếu chúng ta đếm lên từ (1, 1). Trong cả hai trường hợp, tâm là
điểm thứ tư tính từ gốc tọa độ. Nếu chỉ có một trong các kích thước là lẻ, tâm dọc
theo chiều đó cũng thu được tương tự bằng cách làm tròn xuống theo cách vừa giải
thích. Sử dụng hàm f loor và lưu ý rằng gốc MATLAB là (1, 1), tâm của hình chữ
nhật tần số cho các phép tính MATLAB là tại

Trung tâm được cung cấp bởi biểu thức này hợp lệ cho cả giá trị chẵn và lẻ của M
và N. Trong ngữ cảnh này, một cách đơn giản để nhớ sự khác biệt giữa các hàm
fftshift và i fftshi ft đã thảo luận trước đó là cách sắp xếp lại dữ liệu sao cho giá trị
tại vị trí (1, 1) được chuyển đến trung tâm của hình chữ nhật tần số, trong khi tôi
fftshi ft sắp xếp lại dữ liệu để giá trị ở trung tâm của hình chữ nhật tần số được
chuyển đến vị trí (1, 1).
Cuối cùng, chúng tôi chỉ ra rằng phép biến đổi Fourier ngược được tính bằng cách
sử dụng hàm i fft2, có cú pháp cơ bản
f = ifft2 (F)
trong đó F là biến đổi Fourier và f là ảnh thu được. Bởi vì fft2 chuyển đổi hình ảnh
đầu vào thành lớp kép mà không chia tỷ lệ, cần phải cẩn thận khi giải thích kết quả
của phép nghịch đảo. Ví dụ, nếu f thuộc lớp uintB thì các giá trị của nó là số
nguyên trong phạm vi [O 255] và fft2 chuyển nó thành lớp kép trong cùng một
phạm vi. Do đó, kết quả của phép toán ifft2 (F), về lý thuyết phải giống với f, là
một hình ảnh có các giá trị trong cùng phạm vi [0 255], nhưng thay vào đó là lớp
kép. Sự thay đổi trong lớp hình ảnh này có thể dẫn đến khó khăn nếu không được
tính toán đúng cách. Bởi vì hầu hết các ứng dụng fft2 của chúng tôi tại một số thời
điểm liên quan đến việc sử dụng i fft2 để quay trở lại miền không gian, quy trình
chúng tôi làm theo trong cuốn sách là sử dụng hàm tof loat để chuyển đổi hình ảnh
đầu vào thành dấu phẩy động trong phạm vi [O 1 ] và sau đó, ở cuối quy trình,
chúng tôi sử dụng tính năng revertclass của tof loat để chuyển đổi kết quả về cùng
lớp với ban đầu. Bằng cách này, chúng tôi không phải lo lắng về các vấn đề mở
rộng quy mô.
Nếu hình ảnh đầu vào được sử dụng để tính F là thực, thì nghịch đảo trên lý thuyết
phải là thực. Tuy nhiên, trong các phiên bản trước đó của MATLAB, đầu ra của
ifft2 thường có các thành phần ảo nhỏ do lỗi làm tròn trong tính toán và thực tế
phổ biến là trích xuất phần thực của kết quả sau khi tính toán phần ngược để thu
được hình ảnh chỉ bao gồm thực các giá trị. Hai hoạt động có thể được kết hợp:
>> f = real ( ifft2(F ));
Nhìn vào MATLAB 7, ifft2 thực hiện kiểm tra xem đầu vào của nó có đối xứng
liên hợp hay không. Nó là, tôi fft2 xuất ra một kết quả thực. Đối xứng liên hợp có
thể áp dụng cho tất cả các công việc trong chương này và bởi vì chúng tôi sử dụng
MATLAB 7 trong cuốn sách, chúng tôi không thực hiện thao tác trước đó. Tuy
nhiên, bạn nên lưu ý vấn đề này trong các trường hợp có thể sử dụng các phiên bản
MATLAB cũ hơn. Tính năng này trong MATLAB 7 giúp kiểm tra tính đúng đắn
của các bộ lọc. Nếu bạn đang làm việc như chúng tôi trong cuốn sách này với hình
ảnh thực và đối xứng, thực bộ lọc, cảnh báo từ MATLAB 7 rằng các phần ảo có
trong kết quả là dấu hiệu cho thấy có điều gì đó không chính xác trong bộ lọc hoặc
trong quy trình bạn đang sử dụng để áp dụng nó.
Cuối cùng, lưu ý rằng, nếu padding được sử dụng trong tính toán biến đổi, hình
ảnh thu được từ các phép tính FFT có kích thước P X Q, trong khi hình ảnh gốc có
kích thước M X N. Do đó, kết quả phải được cắt theo kích thước ban đầu này. Quy
trình để thực hiện việc này được thảo luận trong phần tiếp theo.
4.3 Lọc trong miền tần số
Trong phần này, chúng tôi đưa ra một cái nhìn tổng quan ngắn gọn về các khái
niệm liên quan đến lọc miền tần số và việc triển khai nó trong MATLAB.
4.3.1 Cơ bản
Nền tảng cho phép lọc tuyến tính trong cả miền không gian và tần số là định lý tích
chập, có thể được viết dưới dạng ký hiệu là

và ngược lại

Ký hiệu "sao" cho biết tích chập của hai hàm và các biểu thức ở hai bên của mũi
tên đôi tạo thành một cặp biến đổi Fourier. Ví dụ, biểu thức đầu tiên chỉ ra rằng
tích chập của hai hàm không gian (số hạng ở bên trái của biểu thức) có thể thu
được bằng cách tính biến đổi Fourier nghịch đảo của tích các biến đổi Fourier của
hai hàm (số hạng ở bên phải bên của biểu thức). Ngược lại, phép biến đổi Fourier
thuận của tích chập của hai hàm không gian cho ra tích của các phép biến đổi của
hai hàm. Nhận xét tương tự áp dụng cho biểu thức thứ hai. Về mặt lọc, chúng tôi
quan tâm đến biểu thức đầu tiên.
Vì các lý do sẽ sớm trở nên rõ ràng, hàm H (u, v) được gọi là hàm truyền bộ lọc và
ý tưởng trong lọc miền tần số là chọn một hàm truyền bộ lọc sửa đổi F (u, v) theo
cách cụ thể . Ví dụ, bộ lọc trong Hình 4.4 (a) có một hàm truyền, khi nhân với F (u,
v) ở giữa, làm suy giảm các thành phần tần số cao của F (u, v), trong khi để lại các
tần số thấp một cách tương đối không thay đổi. Các bộ lọc có đặc điểm này được
gọi là bộ lọc thông thấp. Như đã thảo luận trong Phần 4.5.2, kết quả thực của lọc
thông thấp là làm mờ hình ảnh (làm mịn). Hình 4.4 (b) cho thấy cùng một bộ lọc
sau khi nó được xử lý bằng fftshift. Đây là định dạng bộ lọc được sử dụng thường
xuyên nhất trong cuốn sách khi xử lý lọc miền tần số trong đó biến đổi Fourier của
đầu vào không được căn giữa.
Như đã giải thích trong Phần 3.4.1, lọc trong miền không gian bao gồm việc kết
hợp một hình ảnh f (x, y) với mặt nạ lọc, h (x, y). Các chức năng được thay thế cho
nhau cho đến khi một trong các chức năng trượt hoàn toàn qua chức năng kia.
Theo định lý tích chập, chúng ta sẽ nhận được cùng một kết quả trong miền tần số
bằng cách nhân F (u, v) với H (u, v), biến đổi Fourier của bộ lọc không gian. Tuy
nhiên, khi làm việc với các đại lượng rời rạc, chúng ta biết rằng F và H là tuần
hoàn, điều này ngụ ý rằng phép tích chập được thực hiện trong miền tần số rời rạc
cũng là tuần hoàn. Vì lý do này, phép chập được thực hiện bằng DFf được gọi là
phép chập tròn. Cách duy nhất để đảm bảo rằng phép tích chập vòng và không gian
cho cùng một kết quả là sử dụng phần đệm 0 thích hợp, như được giải thích trong
đoạn sau.

Dựa vào định lý tích chập, chúng ta biết rằng để thu được ảnh đã lọc tương ứng
trong miền không gian, chúng ta tính biến đổi Fourier ngược của tích H (u, v) F (u,
v). Như chúng ta vừa giải thích, hình ảnh và các phép biến đổi của chúng là tuần
hoàn khi làm việc với DFfs. Không khó để hình dung rằng các hàm tuần hoàn xoay
vòng có thể gây ra nhiễu giữa các chu kỳ liền kề nếu các chu kỳ gần với khoảng
thời gian của các phần khác nhau của các hàm. Sự can thiệp này, được gọi là lỗi
bao quanh, có thể tránh được bằng cách đệm các hàm bằng số không, theo cách
sau.
Giả sử rằng các hàm f (x, y) và h (x, y) có kích thước lần lượt là AX B và C X D.
Chúng tôi tạo thành hai hàm mở rộng (có đệm), cả hai đều có kích thước PX Q,
bằng cách thêm các số không vào f và g. Có thể chỉ ra (Gonzalez và Woods
[2008]) rằng lỗi bao quanh có thể tránh được bằng cách chọn
Hầu hết công việc trong chương này đề cập đến các hàm có cùng kích thước, M X
N, trong trường hợp này chúng ta sử dụng các giá trị đệm sau: P> = 2M - 1 và Q>
= 2N - 1.
Hàm sau, được gọi là paddedsize, tính toán các giá trị sự kiện tối thiểu của P và Q
cần thiết để thỏa mãn các phương trình trước đó. Hàm cũng có một tùy chọn để
đệm các đầu vào để tạo thành các hình vuông có kích thước bằng lũy thừa số
nguyên gần nhất là 2. Thời gian thực thi các thuật toán FFf phụ thuộc gần như vào
số thừa số nguyên tố trong P và Q. Các thuật toán này thường nhanh hơn khi P và
Q là lũy thừa của 2 so với khi P và Q nguyên tố. Trong thực tế, bạn nên làm việc
với hình ảnh vuông và bộ lọc để việc lọc giống nhau theo cả hai hướng. Kích thước
đệm chức năng cung cấp sự linh hoạt để làm điều này thông qua sự lựa chọn của
các tham số đầu vào. Trong đoạn mã sau, các vectơ AB, CD và PQ lần lượt có các
phần tử [A B], [C D] và [P Q], trong đó các đại lượng này được xác định ở trên.
Cú pháp này thêm đủ số 0 vào f sao cho hình ảnh kết quả có kích thước PQ (1) X
PQ (2). Lưu ý rằng khi f được đệm, hàm lọc trong miền tần số cũng phải có kích
thước PQ (1) x PQ (2).
Chúng tôi đã đề cập trước đó trong phần này rằng phiên bản rời rạc của định lý tích
chập yêu cầu rằng cả hai hàm được biến đổi đều phải được đệm trong miền không
gian. Điều này là bắt buộc để tránh lỗi bao quanh. Khi lọc, một trong hai hàm liên
quan đến tích chập là bộ lọc. Tuy nhiên, trong lọc miền tần số sử dụng OFT, chúng
tôi chỉ định bộ lọc trực tiếp trong miền tần số và có kích thước bằng hình ảnh đệm.
Nói cách khác, chúng tôi không chèn bộ lọc trong miền không gian. Do đó, không
thể đảm bảo rằng lỗi bao quanh được loại bỏ hoàn toàn. May mắn thay, phần đệm
của hình ảnh, kết hợp với hình dạng mượt mà của các bộ lọc mà chúng tôi quan
tâm thường dẫn đến lỗi bao quanh không đáng kể.
• Hình ảnh, f, trong Hình 4.5 (a) được sử dụng trong ví dụ này để minh họa sự khác
biệt giữa lọc có và không có đệm. Trong phần thảo luận sau, chúng tôi sử dụng
hàm lpf il ter để tạo bộ lọc thông thấp Gaussian [tương tự như Hình 4.4 (b)] với giá
trị cụ thể là sigma (sig). Hàm này được thảo luận trong Phần 4.5.2, nhưng cú pháp
rất đơn giản, vì vậy chúng tôi sử dụng nó ở đây và hoãn giải thích thêm về lpfilter
cho phần đó
Các lệnh sau thực hiện lọc mà không có đệm:

Hình 4.5 (b) cho thấy hình ảnh g. Như mong đợi, hình ảnh bị mờ, nhưng lưu ý rằng
các cạnh dọc thì không. Lý do có thể được giải thích với sự trợ giúp của Hình 4.6
(a), cho thấy bằng đồ thị tính tuần hoàn ngụ ý trong các phép tính OFT. Các đường
trắng mỏng giữa các hình ảnh được bao gồm để thuận tiện cho việc xem; chúng
không phải là một phần của dữ liệu. Các đường đứt nét được sử dụng để chỉ định
hình ảnh M X N được xử lý bởi fft2. Hãy tưởng tượng xoay một bộ lọc làm mờ với
chuỗi tuần hoàn vô hạn này. Rõ ràng là khi bộ lọc đi qua phần trên cùng của hình
ảnh gạch ngang, nó sẽ bao gồm một phần của chính hình ảnh và cũng là phần dưới
cùng của thành phần tuần hoàn ngay phía trên nó. Do đó, khi vùng sáng và vùng
tối nằm dưới bộ lọc, kết quả sẽ là đầu ra có màu đen, mờ. Đây chính xác là những
gì trên cùng của hình ảnh trong Hình 4.5 (b) cho thấy. Mặt khác, khi bộ lọc ở một
bên của hình ảnh đứt nét, nó sẽ gặp một vùng giống hệt nhau trong thành phần tuần
hoàn liền kề với bên đó. Bởi vì giá trị trung bình của một vùng không đổi là cùng
một hằng số, nên phần này của kết quả sẽ không bị mờ. Các phần khác của hình
ảnh trong Hình 4.5 (b) được giải thích theo cách tương tự.
Bây giờ hãy xem xét việc lọc bằng đệm:

trong đó chúng tôi đã sử dụng 2 * sig vì kích thước bộ lọc bây giờ gấp đôi kích
thước của bộ lọc được sử dụng mà không có đệm.
Hình 4.7 cho thấy kết quả đầy đủ, có đệm, gp. Kết quả cuối cùng trong Hình 4.5
(c) thu được bằng cách cắt Hình 4.7 về kích thước hình ảnh ban đầu (xem lệnh thứ
sáu trong đoạn mã trước đó). Kết quả này có thể được giải thích với sự trợ giúp của
Hình 4.6 (b), cho thấy hình ảnh gạch ngang được đệm bằng các số không (đen) vì
nó sẽ được thiết lập trong fft2 (f, PQ (1), PQ (2)) trước tính toán OFT. Tính chu kỳ
ngụ ý được giải thích trước đó. Hình ảnh bây giờ có viền đen đồng nhất xung
quanh nó, vì vậy việc xoay bộ lọc làm mịn với chuỗi vô hạn này sẽ hiển thị mờ
xám ở tất cả các cạnh sáng của hình ảnh. Một kết quả tương tự sẽ thu được bằng
cách thực hiện lọc không gian sau đây,

Nhắc lại mục 3.4. 1 rằng lệnh gọi hàm imf ilter này đệm đường viền của hình ảnh
bằng Os theo mặc định.

4.3.2 Các bước cơ bản trong lọc OFT


Thảo luận trong phần trước được tóm tắt trong quy trình từng bước sau đây, trong
đó f là hình ảnh được lọc, g là kết quả và giả định rằng hàm lọc, H, có cùng kích
thước với hình ảnh được đệm :
1. Chuyển hình ảnh đầu vào thành dấu phẩy động bằng cách sử dụng hàm
tofloat:
[f, reve rtclass ] = tofloat (f) ;
2. Nhận các thông số đệm bằng cách sử dụng kích thước đệm hàm:
PQ = paddedzsize ( size(f) );
3. Nhận biến đổi Fourier với padding:
F = fft2 (f, PQ ( 1 ), PQ (2) );
4. Tạo một hàm bộ lọc, H, có kích thước PQ (1) x PQ (2) bằng cách sử dụng
bất kỳ phương pháp nào được thảo luận trong phần còn lại của chương này.
Bộ lọc phải có định dạng như trong Hình 4.4 (b). Thay vào đó, nếu nó được
căn giữa, như trong Hình 4.4 (a), hãy đặt H = nếu ft shift (H) trước khi sử
dụng bộ lọc.
5. Nhân biến đổi với bộ lọc:

6. Lấy FFf nghịch đảo của G:


g = ifft2 (G) ;
7. Cắt hình chữ nhật trên cùng bên trái về kích thước ban đầu

8. Chuyển đổi hình ảnh đã lọc thành loại hình ảnh đầu vào, nếu muốn:
g = revertclass (g) ;
Hình 4.8 cho thấy quy trình lọc theo sơ đồ. Giai đoạn tiền xử lý bao gồm các công
việc như xác định kích thước hình ảnh, lấy các thông số đệm và tạo bộ lọc. Quá
trình hậu xử lý thường đòi hỏi phải cắt hình ảnh đầu ra và chuyển đổi nó thành lớp
của đầu vào.
Hàm bộ lọc H (u, v) trong Hình 4.8 nhân cả phần thực và phần ảo của F (u, v). Nếu
H (u, v) là thực, thì pha của kết quả không bị thay đổi, một thực tế có thể thấy
trong phương trình pha (Phần 4.1) bằng cách lưu ý rằng, nếu số nhân của phần thực
và phần ảo bằng nhau, chúng triệt tiêu, làm cho góc pha không đổi. Các bộ lọc hoạt
động theo cách này được gọi là bộ lọc dịch chuyển pha 0. Đây là những loại bộ lọc
tuyến tính duy nhất được xem xét trong chương này.
Từ lý thuyết hệ thống tuyến tính, ai cũng biết rằng, trong những điều kiện nhẹ nhất
định, việc đưa một xung vào một hệ thống tuyến tính hoàn toàn đặc trưng cho hệ
thống. Khi sử dụng các kỹ thuật được phát triển trong chương này, phản ứng của
một hệ thống tuyến tính, bao gồm cả phản ứng đối với xung động, cũng là hữu hạn.
Nếu hệ thống tuyến tính là một bộ lọc, thì chúng ta hoàn toàn có thể xác định bộ
lọc bằng cách quan sát phản ứng của nó với một xung. Một bộ lọc được xác định
theo cách này được gọi là bộ lọc đáp ứng mô-đun (FIR) hữu hạn. Tất cả các bộ lọc
tuyến tính trong cuốn sách này là bộ lọc FIR.
4.3.3 Một chức năng M để lọc trong miền tần số
Các bước lọc được mô tả trong phần trước được sử dụng trong suốt chương này và
các phần tiếp theo, vì vậy sẽ rất tiện lợi khi có sẵn một hàm M chấp nhận làm đầu
vào hình ảnh và một chức năng bộ lọc, xử lý tất cả các chi tiết lọc và đầu ra hình
ảnh đã lọc, cắt xén. Hàm sau thực hiện điều đó. Giả định rằng chức năng lọc đã
được định kích thước thích hợp, như đã giải thích trong bước 4 của quy trình lọc
Trong một số ứng dụng, việc chuyển đổi hình ảnh được lọc sang cùng lớp với đầu
vào là rất hữu ích; ở những người khác, cần phải làm việc với một kết quả dấu
phẩy động. Chức năng có khả năng làm cả hai.
Các kỹ thuật tạo vòng cung bộ lọc miền tần số được thảo luận trong ba phần sau.
4.4 Lấy bộ lọc miền tần số từ bộ lọc không gian
Nói chung, lọc trong miền không gian hiệu quả hơn về mặt tính toán so với lọc
miền tần số khi các bộ lọc nhỏ. Định nghĩa về nhỏ là một câu hỏi phức tạp mà câu
trả lời phụ thuộc vào các yếu tố như máy móc và thuật toán được sử dụng, và các
vấn đề như kích thước của bộ đệm, dữ liệu phức tạp được xử lý như thế nào và một
loạt các yếu tố khác ngoài phạm vi của cuộc thảo luận này . Một so sánh của
Brigham [1988] bằng cách sử dụng các hàm 1-D cho thấy rằng việc lọc bằng thuật
toán FFf có thể nhanh hơn việc triển khai không gian khi các bộ lọc có thứ tự từ 32
phần tử trở lên, do đó các số trong câu hỏi không lớn. Do đó, rất hữu ích nếu biết
cách chuyển đổi bộ lọc không gian thành bộ lọc miền tần số tương đương để có
được các so sánh có ý nghĩa giữa hai cách tiếp cận.
Chúng tôi quan tâm đến phần này về hai chủ đề chính: (1) cách chuyển đổi bộ lọc
không gian thành bộ lọc miền tần số tương đương; và (2) cách so sánh kết quả giữa
lọc miền không gian bằng hàm imfilter và lọc miền tần số bằng các kỹ thuật đã
thảo luận trong phần trước. Bởi vì, như được giải thích chi tiết trong Phần 3.4.1,
imfilter sử dụng mối tương quan và nguồn gốc của bộ lọc được coi là trung tâm
của nó, một số tiền xử lý được yêu cầu để làm cho hai cách tiếp cận tương đương.
Chức năng hộp công cụ xử lý hình ảnh freqz2 thực hiện điều này và xuất bộ lọc
tương ứng trong miền tần số.
Hàm freqz2 tính toán đáp ứng tần số của các bộ lọc FIR, như đã đề cập ở cuối
Phần 4.3.2, là các bộ lọc tuyến tính duy nhất được xem xét trong cuốn sách này.
Kết quả là bộ lọc mong muốn trong miền tần số. Cú pháp có liên quan trong cuộc
thảo luận hiện tại là:
H = freqz2 (h, R, C)
trong đó h là bộ lọc không gian 2-D và H là bộ lọc miền tần số 2-D tương ứng. Ở
đây, R là số hàng và C là số cột mà chúng ta muốn bộ lọc H có. Nói chung, chúng
tôi cho R = PQ (1) và C = PQ (2), như được giải thích trong Phần 4.3.1. Nếu f
reqz2 được viết mà không có đối số đầu ra, giá trị tuyệt đối của H được hiển thị
trên màn hình MATLAB dưới dạng biểu đồ phối cảnh 3-D. Các cơ học liên quan
đến việc sử dụng hàm freqz2 được giải thích tốt nhất bằng một ví dụ.
VÍ DỤ 4.2: So sánh việc lọc trong miền không gian và miền tần số.
Hãy xem xét hình ảnh 600 X 600 pixel, f, trong Hình 4.9 (a). Theo cách sau, chúng
tôi tạo ra bộ lọc miền tần số, H, tương ứng với bộ lọc không gian Sobel tăng cường
các cạnh dọc (Bảng 3.5). Sau đó, sử dụng imfilter, chúng tôi so sánh kết quả lọc f
trong miền không gian với mặt nạ Sobel với kết quả thu được khi thực hiện quá
trình tương đương trong miền tần số. Trong thực tế, việc lọc với một bộ lọc nhỏ
như mặt nạ Sobel sẽ được thực hiện trực tiếp trong miền không gian, như đã đề cập
trước đó. Tuy nhiên, chúng tôi chọn bộ lọc này cho mục đích trình diễn vì các hệ
số của nó đơn giản và vì kết quả của bộ lọc là trực quan và dễ so sánh. Các bộ lọc
không gian lớn hơn được xử lý theo cùng một cách.

Hình 4.9 (b) là phổ Fourier của f, thu được theo cách thông thường:
Tiếp theo, chúng tôi tạo bộ lọc không gian bằng cách sử dụng hàm fspecial:

Để xem biểu đồ của bộ lọc miền tần số tương ứng, chúng tôi nhập
>> freqz2 (h)
Hình 4. l0 (a) cho thấy kết quả, với các trục bị triệt tiêu (các kỹ thuật thu được các
đồ thị phối cảnh được thảo luận trong Phần 4.5.3). Bản thân bộ lọc được lấy bằng
các lệnh:

trong đó, như đã lưu ý trước đó, i fftshift là cần thiết để sắp xếp lại dữ liệu sao cho
điểm gốc nằm ở trên cùng, bên trái của hình chữ nhật tần số. Hình 4.l0 (b) cho thấy
một đồ thị của abs (H1). Hình 4.l0 (c) và (d) hiển thị các giá trị tuyệt đối của dạng
mô phỏng H và H1, được hiển thị bằng các lệnh

Tiếp theo, chúng tôi tạo các hình ảnh được lọc. Trong miền không gian chúng tôi
sử dụng
>> gs = imf ilte r(f, h ) ;
theo mặc định sẽ đệm đường viền của hình ảnh bằng Os. Hình ảnh được lọc thu
được bằng xử lý miền tần số được đưa ra bởi
>> gf = dftf ilt (f, H1 );
Hình 4. 11 (a) và (b) cho thấy kết quả của các lệnh:

Tông màu xám trong ảnh là do cả gs và gf đều có giá trị âm, điều này làm tăng giá
trị trung bình của ảnh bằng lệnh imshow được chia tỷ lệ. Như đã thảo luận trong
Phần 7.6.1 và 11.1.3, mặt nạ Sobel, h, được tạo ở trên được sử dụng để phát hiện
các cạnh dọc trong hình ảnh bằng cách sử dụng giá trị tuyệt đối của phản hồi. Do
đó, nó phù hợp hơn để hiển thị các giá trị tuyệt đối của hình ảnh vừa được tính
toán. Hình 4.11 (c) và (d) cho thấy các hình ảnh thu được bằng các lệnh

Các cạnh có thể được nhìn thấy rõ ràng hơn bằng cách tạo một hình ảnh nhị phân
có ngưỡng:
trong đó hệ số 0,2 được chọn để chỉ hiển thị các cạnh có cường độ lớn hơn 20% giá
trị lớn nhất của gs và gf. Hình 4.1 2 (a) và (b) cho thấy kết quả.
Các hình ảnh thu được bằng cách sử dụng lọc miền không gian và tần số cho tất cả
các mục đích thực tế giống hệt nhau, một thực tế là chúng tôi xác nhận bằng cách
tính toán sự khác biệt của chúng:
>> d = abs ( gs - gf );
Sự khác biệt tối đa là
>> max ( d ( : ) )
không đáng kể trong bối cảnh của ứng dụng hiện tại. Sự khác biệt tối thiểu là

Cách tiếp cận vừa giải thích có thể được sử dụng để triển khai trong miền tần số
cách tiếp cận lọc không gian được thảo luận trong Phần 3.4.1 và 3.5.1, cũng như
bất kỳ bộ lọc không gian FIR nào khác có kích thước tùy ý.
4.5 Tạo bộ lọc trực tiếp trong miền tần số
Trong phần này, chúng tôi minh họa cách triển khai các chức năng bộ lọc trực tiếp
trong miền tần số. Chúng tôi tập trung vào các bộ lọc đối xứng tròn được chỉ định
dưới dạng các hàm khác nhau của khoảng cách từ tâm của các bộ lọc. Các chức
năng M tùy chỉnh được phát triển để triển khai các bộ lọc này là nền tảng có thể dễ
dàng mở rộng sang các chức năng khác trong cùng một khuôn khổ. Chúng tôi bắt
đầu bằng cách triển khai một số bộ lọc làm mịn (lowpass) nổi tiếng. Sau đó, chúng
tôi trình bày cách sử dụng một số khả năng vẽ biểu đồ bề mặt và khung dây của
MATLAB để hiển thị bộ lọc. Sau đó, chúng ta thảo luận về các bộ lọc làm sắc nét
(thông cao) và kết thúc chương với sự phát triển của các kỹ thuật lọc chọn lọc.
4.5.1 Tạo mảng lưới để sử dụng trong việc triển khai bộ lọc trong miền tần số
Trọng tâm của các hàm M trong cuộc thảo luận sau đây là nhu cầu tính toán các
hàm khoảng cách từ bất kỳ điểm nào đến một điểm xác định trong hình chữ nhật
tần số. Bởi vì các phép tính FFf trong MATLAB giả định rằng điểm gốc của phép
biến đổi là ở trên cùng, bên trái của hình chữ nhật tần số, nên các phép tính khoảng
cách của chúng tôi liên quan đến điểm đó. Như trước đây, dữ liệu có thể được sắp
xếp lại cho các mục đích trực quan (để giá trị tại điểm gốc được dịch sang tâm của
hình chữ nhật tần số) bằng cách sử dụng hàm fftshift. Hàm M sau đây, mà chúng
tôi gọi là dft uv, cung cấp các mảng meshgrid cần thiết để sử dụng trong tính toán
khoảng cách và các ứng dụng tương tự khác. (Xem Phần 2.10.5 để biết giải thích
về hàm meshgrid được sử dụng trong đoạn mã sau.). Các mảng meshgrid do dftuv
tạo ra theo thứ tự cần thiết để xử lý với fft2 hoặc i fft2, vì vậy không cần sắp xếp
lại dữ liệu.

Lưu ý rằng khoảng cách là 0 ở trên cùng, bên trái và các khoảng cách lớn hơn nằm
ở trung tâm của hình chữ nhật tần số, theo định dạng cơ bản được giải thích trong
Hình 4.2 (a). Chúng ta có thể sử dụng hàm fftshi ft để thu được khoảng cách đối
với tâm của hình chữ nhật tần số,
Khoảng cách bây giờ là 0 tại tọa độ (5, 3) và mảng đối xứng về điểm này.
Trong khi về chủ đề khoảng cách, chúng tôi đề cập rằng hàm giả thuyết thực hiện
tính toán tương tự như D = sq rt (U. A 2 + V. A 2), nhưng nhanh hơn. Ví dụ, cho U
= V = 1 024 và sử dụng hàm t imei t (xem Phần 2.10.5), chúng ta thấy rằng giả
thuyết tính D nhanh hơn gần 100 lần so với cách "chuẩn". Cú pháp cho giả thuyết
là:
D = hypot (U, V)
Chúng tôi sử dụng giả thuyết rộng rãi trong các phần sau.
4.5.2 Bộ lọc miền tần số thông thấp (làm mịn)
Một bộ lọc thông thấp lý tưởng (ILPF) có chức năng truyền

trong đó D0 là một số dương và D (u, v) là khoảng cách từ điểm (u, v) đến tâm của
bộ lọc. Quỹ tích của các điểm mà D (u, v) = D0 là một đường tròn. Bởi vì bộ lọc H
(u, v) nhân biến đổi Fourier của một hình ảnh, chúng ta thấy rằng một bộ lọc lý
tưởng "cắt bỏ" (nhân với 0) tất cả các thành phần của F (u, v) bên ngoài hình tròn
và không thay đổi (nhân với 1 ) tất cả các thành phần trên hoặc bên trong vòng
tròn. Mặc dù bộ lọc này không thể thực hiện được ở dạng tương tự bằng cách sử
dụng các thành phần điện tử, nhưng nó chắc chắn có thể được mô phỏng trong máy
tính bằng cách sử dụng chức năng truyền trước đó. Các thuộc tính của bộ lọc lý
tưởng thường hữu ích trong việc giải thích các hiện tượng như lỗi đổ chuông và lỗi
bao quanh.
Bộ lọc thông thấp Butterworth (BLPF) bậc n, với tần số cắt ở khoảng cách 00 từ
tâm bộ lọc, có chức năng truyền
Không giống như ILPF, chức năng truyền BLPF không có sự gián đoạn rõ nét tại
D0 Đối với các bộ lọc có chức năng truyền tải mượt mà, thông thường xác định
quỹ tích tần số cắt tại các điểm mà H (u, v) xuống đến một phần cụ thể của nó gia
trị lơn nhât. Trong phương trình trước, H (u, v) = 0,5 (giảm 50% so với giá trị lớn
nhất của nó là 1) khi D (u, v) = D0.
Hàm truyền của bộ lọc thông thấp Gaussian (GLPF) được đưa ra bởi

trong đó u là độ lệch chuẩn. Bằng cách cho u = D0, chúng ta thu được biểu thức
sau về tham số cắt

Khi D (u, v) = D0, bộ lọc giảm xuống 0,607 giá trị lớn nhất của nó là 1. Các bộ lọc
trước đó được tóm tắt trong Bảng 4.1.
VÍ DỤ 4.4: Lọc thông thấp.
• Như một minh họa, chúng tôi áp dụng bộ lọc thông thấp Gaussian cho hình ảnh
500 X 500 pixel, f, trong Hình 4.13 (a). Chúng tôi sử dụng giá trị D0 bằng 5%
chiều rộng hình ảnh được đệm. Với tham chiếu đến các bước lọc được thảo luận
trong Phần 4.3.2, chúng tôi viết

Để xem bộ lọc dưới dạng hình ảnh [Hình. 4.13 (b)] chúng tôi căn giữa nó bằng
cách sử dụng fftshift:
>> figure , imshow ( fftshift (H) )
Tương tự, quang phổ có thể được hiển thị dưới dạng hình ảnh [Hình. 4.13 (c)] bằng
cách nhập
>> f igure , imshow(log(1 + abs ( fftshift ( F ))), [ ])
Cuối cùng, Hình 4. 1 3 (d) hiển thị hình ảnh đầu ra, được hiển thị bằng lệnh
>> figure , imshow(g)
Đúng như dự đoán, hình ảnh này là một phiên bản mờ của bản gốc.
Hàm sau tạo ra các hàm truyền của các bộ lọc thông thấp trong Bảng 4. 1.
Chức năng lpfilter được sử dụng lại trong Phần 4.6 làm cơ sở để tạo các bộ lọc
thông cao.
4.5.3 Wireframe và Surface Plotting
Đồ thị hàm của một biến đã được giới thiệu trong Phần 3.3.1. Trong phần thảo luận
sau đây, chúng tôi giới thiệu khung dây 3-D và đồ thị bề mặt, rất hữu ích để hình
dung các bộ lọc 2-D. Cách dễ nhất để vẽ biểu đồ khung dây của một hàm M X N,
2-D, H, là sử dụng hàm lưới, có cú pháp cơ bản
Hàm này vẽ một khung dây cho x = 1: M và y = 1: N. Biểu đồ khung dây thường
dày đặc đến mức không thể chấp nhận được nếu M và N lớn, trong trường hợp đó,
chúng tôi vẽ biểu đồ điểm thứ k sử dụng cú pháp
mesh (H(1 :k:end , 1 :k:end ))
Thông thường, 40 đến 60 điểm dọc theo mỗi trục cung cấp sự cân bằng tốt giữa độ
phân giải và hình thức.
MATLAB vẽ các số liệu lưới theo màu theo mặc định. Lệnh
colormap ( [ 0 0 0 ] )
đặt khung dây thành màu đen (chúng ta thảo luận về bản đồ màu hàm trong Phần
7.1.2). MATLAB cũng chồng lưới và trục trên một ô lưới. Lưới được tắt bằng lệnh
grid off
Tương tự, các trục bị tắt bằng lệnh
axis off
Cuối cùng, điểm quan sát (vị trí của người quan sát) được điều khiển bởi chế độ
xem chức năng, có cú pháp
view(az , el)
Như Hình 4.14 cho thấy, az và el đại diện cho góc phương vị và góc nâng (theo
độ), tương ứng. Các mũi tên chỉ hướng tích cực. Các giá trị mặc định là az = - 37. 5
và el = 30, đặt người xem trong góc phần tư đã xác định bởi các trục -x và -y, và
nhìn vào góc phần tư được xác định bởi các trục x và y dương trong Hình 4.14.
Để xác định hình dạng xem hiện tại, hãy nhập
>> [ az , el] = view ;
Để đặt quan điểm thành các giá trị mặc định, hãy nhập
>> view(3)
Điểm quan sát có thể được sửa đổi tương tác bằng cách nhấp vào nút Xoay 30 trên
thanh công cụ của cửa sổ hình, sau đó nhấp và kéo trong cửa sổ hình.
Như đã thảo luận trong Phần 7.1.1, có thể chỉ định vị trí của người xem theo tọa độ
Descartes, (x, y, z), lý tưởng khi làm việc với dữ liệu RGB. Tuy nhiên, đối với mục
đích xem cốt truyện chung, phương pháp vừa thảo luận chỉ liên quan đến hai tham
số và trực quan hơn.
VÍ DỤ 4.5: Vẽ khung dây
Hãy xem xét một bộ lọc thông thấp Gaussian tương tự như bộ lọc trong Ví dụ 4.4:
>> H = fftshift ( lpfilter ( ' gaussian ', 500 , 500 , 50 ) );
Hình 4.15 (a) cho thấy biểu đồ khung dây được tạo ra bởi các lệnh

trong đó lệnh trục được mô tả trong Phần 3.3.1.


Như đã lưu ý trước đó trong phần này, khung dây có màu theo mặc định, chuyển từ
màu xanh lam ở gốc sang màu đỏ ở trên cùng. Chúng tôi chuyển đổi các đường
biểu diễn thành màu đen và loại bỏ các trục và lưới bằng cách nhập

Hình 4.15 (b) cho thấy kết quả. Hình 4.15 (c) cho thấy kết quả của lệnh
>> view(-25 , 30 )
làm di chuyển người quan sát một chút sang phải, trong khi giữ nguyên độ cao
không đổi. Cuối cùng, Hình 4.15 (d) cho thấy kết quả của việc để góc phương vị ở
-25 và thiết lập độ cao thành 0:
>> view(-25 , 0)
Ví dụ này cho thấy sức mạnh biểu đồ đáng kể của lưới hàm.
Đôi khi người ta mong muốn vẽ biểu đồ của một hàm dưới dạng bề mặt thay vì
dưới dạng khung dây. Chức năng lướt thực hiện điều này. Cú pháp cơ bản của nó

surf (H)
Hàm này tạo ra một biểu đồ giống hệt với lưới, ngoại trừ các hình tứ giác trong
lưới được tô bằng màu (điều này được gọi là tô bóng các mặt). Để chuyển đổi màu
sắc sang màu xám, chúng tôi sử dụng lệnh
colormap (gray )
Các chức năng trục, g rid và view hoạt động theo cách giống như được mô tả trước
đó cho lưới. Ví dụ, Hình 4.16 (a) là kết quả của chuỗi lệnh sau:

Có thể làm mịn bóng mờ và các đường lưới được loại bỏ bằng nội suy sử dụng
lệnh
shading interp
Gõ lệnh này tại dấu nhắc sẽ tạo ra Hình 4.16 (b).
Khi mục tiêu là vẽ một hàm phân tích của hai biến, chúng tôi sử dụng meshg rid để
tạo ra các giá trị tọa độ và từ đó chúng tôi tạo ra ma trận rời rạc (lấy mẫu) để sử
dụng trong lưới hoặc lướt. Ví dụ, để vẽ hàm

từ -2 đến 2 với gia số 0,1 cho cả x và y, chúng tôi viết

và sau đó sử dụng lưới (Z) hoặc lướt (Z) như trước. Nhớ lại cuộc thảo luận trong
Phần 2.10.5 rằng cột (Y) được liệt kê đầu tiên và hàng (X) thứ hai trong lưới hàm.
4.6 Bộ lọc miền tần số Highpass (Sharpening)
Cũng giống như lọc thông thấp làm mờ một hình ảnh, quá trình ngược lại, lọc
thông cao, làm sắc nét hình ảnh bằng cách làm giảm các tần số thấp và để các tần
số cao của biến đổi Fourier tương đối không thay đổi. Trong phần này, chúng tôi
xem xét một số cách tiếp cận để lọc thông cao.
Với hàm truyền Hlp (u, v) của bộ lọc thông thấp, hàm truyền của bộ lọc thông cao
tương ứng được cho bởi

Bảng 4.2 trình bày các chức năng chuyển bộ lọc thông cao tương ứng với các bộ
lọc thông thấp trong Bảng 4.1.
4.6.1 Chức năng lọc thông cao
Dựa trên phương trình trước, chúng ta có thể sử dụng hàm lpfilter từ phần trước để
xây dựng một hàm tạo bộ lọc thông cao, như sau:
EXAMPLE 4.6: Highpass filters
Hình 4.17 cho thấy các đồ thị và hình ảnh của các bộ lọc thông cao lý tưởng,
Butterworth và Gaussian. Biểu đồ trong Hình 4.l 7 (a) được tạo bằng các lệnh
>> axis off
Hình ảnh tương ứng trong Hình 4.17 (d) được tạo bằng lệnh
>> figure , imshow(H, [ ])
Các lệnh tương tự sử dụng cùng một giá trị cho D11 mang lại phần còn lại của
Hình 4.17 (bộ lọc Butterworth có bậc 2).
EXAMPLE 4.7: Highpass filtering.
Hình 4.18 (a) là cùng một mẫu thử nghiệm, f, từ Hình 4.13 (a). Hình 4.18 (b), thu
được bằng cách sử dụng các lệnh sau, cho thấy kết quả của việc áp dụng bộ lọc
thông cao Gaussian cho f trong miền tần số:

Như Hình 4.18 (b) cho thấy, các cạnh và các chuyển đổi cường độ sắc nét khác
trong hình ảnh đã được tăng cường. Tuy nhiên, vì giá trị trung bình của một hình
ảnh được cho bởi F (0, 0) và các bộ lọc thông cao được thảo luận cho đến nay đã
loại bỏ nguồn gốc của phép biến đổi Fourier. hình ảnh đã mất hầu hết tông màu
xám có trong bản gốc. Vấn đề này được giải quyết trong phần sau.
4.6.2 Lọc nhấn mạnh tần số cao
Như đã đề cập trong Ví dụ 4.7, bộ lọc thông cao không loại bỏ thuật ngữ de, do đó
giảm giá trị trung bình của hình ảnh xuống 0. Một cách tiếp cận được sử dụng để
bù cho điều này là thêm độ lệch vào bộ lọc thông cao. Khi một phần bù được kết
hợp với việc nhân phần phụ với một hằng số lớn hơn 1, phương pháp này được gọi
là lọc nhấn mạnh tần số cao vì hệ số nhân không đổi làm nổi bật các tần số cao. Hệ
số nhân cũng làm tăng biên độ của các tần số thấp, nhưng các tác động của tần số
thấp đối với việc nâng cao ít hơn so với các tác động của tần số cao. với điều kiện
là phần bù nhỏ so với hệ số nhân. Bộ lọc nhấn mạnh tần số cao có chức năng
truyền

trong đó a là độ lệch, h là số nhân và Hhp (u, v) là hàm truyền của bộ lọc thông
cao.
EXAMPLE 4.8: Kết hợp nhấn mạnh tần số cao và cân bằng biểu đồ
Hình 4. 1 9 (a) là hình ảnh X quang ngực kỹ thuật số. Những người chụp ảnh bằng
tia X không thể lấy nét giống như thấu kính quang học, vì vậy hình ảnh thu được
thường có xu hướng hơi mờ. Mục tiêu của ví dụ này là làm sắc nét Hình 4. 19 (a).
Vì các mức cường độ trong hình ảnh cụ thể này thiên về phần cuối tối của thang
màu xám, chúng tôi cũng nhân cơ hội này để đưa ra một ví dụ về cách xử lý miền
không gian có thể được sử dụng để bổ sung cho việc lọc miền tần số
Hình 4. l9 (h) cho thấy kết quả lọc Hình 4.19 (a) với bộ lọc thông cao Butterworth
bậc 2 và giá trị D "bằng 5% kích thước dọc của hình ảnh đệm. Lọc thông cao
không quá nhạy cảm với giá trị của D0, với điều kiện là bán kính của bộ lọc không
quá nhỏ để các tần số gần điểm gốc của phép biến đổi được vượt qua. Như mong
đợi, kết quả lọc khá lạ, nhưng nó hiển thị mờ nhạt các cạnh chính trong Hình ảnh.
Cách duy nhất mà một hình ảnh khác không có giá trị trung bình bằng 0 là nếu một
số giá trị cường độ của nó là âm. Đây là trường hợp trong kết quả được lọc trong
Hình 4.19 (b). Vì lý do này, chúng tôi phải sử dụng Tùy chọn f ltpoint trong hàm
dftf ilt để thu được kết quả dấu phẩy động. Nếu không, các giá trị âm sẽ bị cắt bớt
trong chuyển đổi mặc định thành uint8 (lớp của hình ảnh đầu vào), do đó làm mất
một số chi tiết mờ nhạt. Sử dụng function gscale có tính đến các giá trị âm, do đó
bảo toàn các chi tiết này .
Ưu điểm của lọc nhấn mạnh (với a = 0,5 và h = 2,0 trong trường hợp này) được thể
hiện trong Hình 4.19 (c). trong đó âm sắc ở mức xám do các thành phần tần số thấp
được giữ lại. Các lệnh sau được sử dụng để tạo các hình ảnh đã xử lý trong Hình 4.
1 9, trong đó f biểu thị hình ảnh đầu vào [lệnh cuối cùng được tạo Hình 4.19 (d)]:
Như đã chỉ ra trong Phần 3.3.2, một hình ảnh được đặc trưng bởi các mức cường
độ trong một phạm vi hẹp của thang màu xám là một ứng cử viên cho việc cân
bằng biểu đồ. Như Hình 4.19 (d) cho thấy, đây thực sự là một phương pháp thích
hợp để nâng cao hơn nữa hình ảnh trong ví dụ này. Lưu ý sự rõ ràng của cấu trúc
xương và các chi tiết khác đơn giản là không thể nhìn thấy trong bất kỳ hình ảnh
nào trong ba hình ảnh còn lại. Hình ảnh nâng cao cuối cùng có vẻ hơi nhiễu, nhưng
đây là điển hình của hình ảnh tia X khi thang màu xám của chúng được mở rộng.
Kết quả thu được khi sử dụng sự kết hợp giữa nhấn mạnh tần số cao và cân bằng
biểu đồ là cao hơn kết quả sẽ thu được bằng cách sử dụng một trong hai phương
pháp.
4.7 Lọc chọn lọc
Các bộ lọc được giới thiệu trong hai phần trước hoạt động trên toàn bộ hình chữ
nhật tần số. Như bạn sẽ thấy ngay sau đây, có những ứng dụng yêu cầu lọc các dải
tần hoặc vùng nhỏ trong hình chữ nhật tần số. Các bộ lọc trong danh mục đầu tiên
được gọi là bộ lọc theo dải hoặc bộ lọc thông dải, tùy thuộc vào chức năng của
chúng. Tương tự, các bộ lọc trong danh mục thứ hai được gọi là bộ lọc notchreject
hoặc notchpass.
4.7.1 Bộ lọc dải tần và dải thông
Các bộ lọc này dễ xây dựng bằng cách sử dụng các dạng bộ lọc thông thấp và
thông cao. Giống như với các bộ lọc đó, chúng tôi thu được bộ lọc băng thông Hbp
(u, v) từ bộ lọc đối tượng băng tần Hbr (u, v) đã cho, sử dụng biểu thức:

Bảng 4.3 cho thấy các biểu thức cho các bộ lọc băng tần lý tưởng, Butterworth và
Gaussian. Thông số W là chiều rộng thực của dải chỉ dành cho bộ lọc lý tưởng. Đối
với bộ lọc Gauss, quá trình chuyển đổi diễn ra suôn sẻ, với W hoạt động gần như
một tần số cắt. Đối với bộ lọc Butterworth, quá trình chuyển đổi cũng diễn ra suôn
sẻ, nhưng W và n hoạt động cùng nhau để xác định độ rộng của dải, điều này tăng
lên khi tăng W và n. Nhân vật. 4.20 cho thấy hình ảnh của bộ lọc Gaussian đối
tượng dải và bộ lọc thông dải tương ứng của nó thu được bằng cách sử dụng hàm
sau, hàm này thực hiện cả bộ lọc dải tần và bộ lọc thông dải.
4.7.2 Bộ lọc Notchreject và Notchpass
Bộ lọc Notch là bộ lọc hữu ích nhất trong số các bộ lọc chọn lọc. Bộ lọc khía từ
chối C hoặc vượt qua) tần số trong các vùng lân cận xác định về tâm của hình chữ
nhật tần số. Bộ lọc dịch chuyển pha 0 phải đối xứng về tâm, vì vậy, ví dụ, một rãnh
có tâm ở tần số (u0, v0) phải có một rãnh tương ứng tại (-u0, -v0). Bộ lọc
Notchreject được hình thành như là sản phẩm của bộ lọc thông cao mà các tâm của
nó đã được dịch sang tâm của các rãnh. Dạng chung liên quan đến các cặp khía Q
là:

trong đó Hk (u, v) và H-k (u, v) là các bộ lọc thông cao với tâm lần lượt là (uk, vk)
và (-uk, -vk). Các tâm dịch này được xác định đối với tâm của hình chữ nhật tần số
(M / 2, N / 2). Do đó, các phép tính khoảng cách cho các bộ lọc được đưa ra bởi
các biểu thức

Ví dụ, sau đây là một bộ lọc đối tượng khía Butterworth bậc n, bao gồm ba cặp
khía cạnh:
Hằng số D0k giống nhau đối với một cặp khía, nhưng nó có thể khác đối với các
cặp khác nhau.
Giống như với các bộ lọc thông dải, chúng tôi nhận được bộ lọc thông dải từ bộ lọc
đối tượng khía bằng cách sử dụng phương trình

Hàm sau đây, cnotch, tính toán lý tưởng đối xứng tròn, Butterworth, và các bộ lọc
khía cạnh và khía cạnh Gaussian. Sau đó trong phần này chúng ta sẽ thảo luận về
các bộ lọc notch hình chữ nhật. Vì nó tương tự như bộ lọc vùng chức năng trong
Phần 4.7.1, chúng tôi chỉ hiển thị phần trợ giúp cho chức năng cnotch. Xem Phụ
lục C để biết danh sách đầy đủ.
Hàm cnotch sử dụng hàm tùy chỉnh iseven, có cú pháp

trong đó E là một mảng logic có cùng kích thước với A, với ls (t rue) ở các vị trí
tương ứng với các số chẵn trong A và Os (false) ở những nơi khác. Một chức năng
đồng hành,

trả về ls trong các vị trí tương ứng với các số lẻ trong A và Os ở những nơi khác.
Danh sách các hàm chẵn và lẻ có trong Phụ lục C.
VÍ DỤ 4.9: Sử dụng bộ lọc khía để giảm các mẫu moire.
Ảnh báo thường được in bằng độ phân giải không gian 75 dpi. Khi những hình ảnh
như vậy được quét ở độ phân giải tương tự, kết quả hầu như luôn thể hiện các mô
hình chuyển động mạnh mẽ. Hình 4.21 (a) cho thấy một hình ảnh tờ báo được quét
ở 72 dpi bằng máy quét phẳng. Mô hình chuyển động được coi là giao thoa tuần
hoàn nổi bật. Sự giao thoa tuần hoàn dẫn đến các vụ nổ năng lượng mạnh, cục bộ
trong miền tần số, như Hình 4.2l (b) cho thấy. Bởi vì nhiễu có tần số tương đối
thấp, chúng tôi bắt đầu bằng cách lọc ra các gai gần nhất nguồn gốc. Chúng tôi
thực hiện việc này bằng cách sử dụng hàm cnot ch, như sau, trong đó f là hình ảnh
được quét (chúng tôi đã sử dụng hàm imtool từ Phần 2.3 để thu được tọa độ tương
tác của các tâm của vụ nổ năng lượng):
Hình 4.21 (c) cho thấy phổ với các bộ lọc khía được đặt trên đó. Các giá trị ngưỡng
được chọn vừa đủ lớn để bao gồm các đợt bùng nổ năng lượng, trong khi loại bỏ
càng ít càng tốt khỏi biến đổi. Hình 4.21 (d) cho thấy hình ảnh g, kết quả được lọc.
Như bạn có thể thấy, tính năng lọc notch đã làm giảm sự nổi bật của mô hình
chuyển động xuống mức không thể nhận thấy.
Phân tích cẩn thận, ví dụ, cẳng tay của người bắn trong Hình 4.21 (d), cho thấy một
nhiễu tần số cao mờ nhạt liên quan đến các vụ nổ năng lượng cao khác trong Hình
4.21 (b). Các hoạt động lọc rãnh bổ sung sau đây là một nỗ lực để giảm sự đóng
góp của những sự cố vỡ đó:

Hình 4.21 (e) cho thấy các bộ lọc khía chồng trên phổ và Hình 4.21 (f) là kết quả
được lọc. So sánh hình ảnh này với ° Hình 4.21 (d), chúng ta thấy sự giảm nhiễu
tần số cao. Mặc dù kết quả cuối cùng này còn lâu mới hoàn hảo, nhưng nó là một
cải tiến đáng kể so với hình ảnh ban đầu. Xem xét độ phân giải thấp và độ hỏng
đáng kể của hình ảnh này, kết quả trong Hình 4.21 (f) là tốt như chúng ta có thể
mong đợi một cách hợp lý.
Một trường hợp đặc biệt của lọc khía liên quan đến việc lọc phạm vi giá trị dọc
theo các trục của DFT. Hàm sau sử dụng các hình chữ nhật đặt trên các trục để đạt
được điều này. Chúng tôi chỉ hiển thị văn bản trợ giúp. Xem Phụ lục C để biết
danh sách đầy đủ của mã.
VÍ DỤ 4.10: Sử dụng lọc khía để giảm nhiễu định kỳ do thiết bị hình ảnh bị trục
trặc.
Một ứng dụng quan trọng của lọc khía là giảm nhiễu định kỳ do hệ thống hình ảnh
bị trục trặc. Hình 4.22 (a) cho thấy một ví dụ điển hình. Đây là hình ảnh các vòng
ngoài của hành tinh Sao Thổ, được chụp bởi Cassini, tàu vũ trụ đầu tiên đi vào quỹ
đạo của hành tinh này. Các dải ngang là sự giao thoa định kỳ gây ra tín hiệu AC
chồng lên tín hiệu video của camera ngay trước khi số hóa hình ảnh. Đây là một sự
cố không mong muốn làm hỏng nhiều hình ảnh từ nhiệm vụ. May mắn thay, loại
nhiễu này có thể được sửa chữa bằng cách xử lý hậu kỳ, sử dụng các phương pháp
như được thảo luận trong phần này. Xem xét chi phí và tầm quan trọng của những
hình ảnh này, một giải pháp "sau thực tế" cho vấn đề nhiễu là một ví dụ khác về
giá trị và phạm vi của công nghệ xử lý hình ảnh.
Hình 4.22 (b) cho thấy phổ Fourier. Bởi vì sự giao thoa gần như tuần hoàn đối với
phương thẳng đứng, chúng tôi hy vọng sẽ tìm thấy các vụ nổ năng lượng xuất hiện
trong trục tung của quang phổ. Phân tích cẩn thận về quang phổ chỉ ra rằng thực sự
là như vậy. Chúng tôi loại bỏ nguồn gây nhiễu bằng cách đặt một bộ lọc khía hình
chữ nhật, hẹp trên trục tung bằng các lệnh sau:
Hình 4.22 (c) là bộ lọc khía và Hình 4.22 (d) cho thấy kết quả của bộ lọc:

Như bạn có thể thấy, Hình 4.22 (d) là một cải tiến đáng kể so với bản gốc.
Sử dụng bộ lọc rãnh khía thay vì bộ lọc loại bỏ trên trục tung sẽ cô lập các tần số
của nhiễu. Sau đó IDFf của phép biến đổi được lọc tạo ra chính mẫu giao thoa:

Hình 4.23 (a) và (b) lần lượt cho thấy bộ lọc rãnh khía và dạng giao thoa.
Tóm lược
Tài liệu trong chương này là nền tảng để sử dụng MATLAB và Hộp công cụ xử lý
ảnh trong các ứng dụng liên quan đến lọc trong miền tần số. Ngoài nhiều ví dụ
nâng cao hình ảnh được đưa ra trong các phần trước, các kỹ thuật miền tần số đóng
một vai trò cơ bản trong việc khôi phục hình ảnh (Chương 5), nén hình ảnh
(Chương 9), phân đoạn hình ảnh (Chương 11) và mô tả hình ảnh (Chương 12 ).
Chương 5: phục hồi và tái tạo hình ảnh
Xem trước
Mục tiêu của việc khôi phục là cải thiện một hình ảnh nhất định theo một số nghĩa
được xác định trước. Mặc dù có những vùng chồng chéo giữa nâng cao hình ảnh và
phục hồi hình ảnh, quá trình trước đây phần lớn là một quá trình chủ quan, trong
khi việc khôi phục hình ảnh phần lớn là một quá trình khách quan. Phục hồi cố
gắng tái tạo hoặc khôi phục một hình ảnh đã bị suy giảm chất lượng bằng cách sử
dụng kiến thức tiên nghiệm về hiện tượng suy thoái. Do đó, các kỹ thuật khôi phục
được định hướng theo hướng mô hình hóa sự suy thoái và áp dụng quy trình ngược
để khôi phục hình ảnh ban đầu.
Cách tiếp cận này thường liên quan đến việc xây dựng một tiêu chí tốt để đưa ra
ước tính tối ưu về kết quả mong muốn. Ngược lại, các kỹ thuật nâng cao về cơ bản
là các quy trình heuristic được thiết kế để điều khiển một hình ảnh nhằm tận dụng
các khía cạnh tâm sinh lý của hệ thống thị giác con người. Ví dụ: kéo giãn tương
phản được coi là một kỹ thuật nâng cao vì nó chủ yếu dựa trên các khía cạnh dễ
chịu mà nó có thể thể hiện cho người xem, trong khi loại bỏ mờ ảnh bằng cách áp
dụng chức năng làm mờ được coi là một kỹ thuật phục hồi.
Trong chương này, chúng ta khám phá cách sử dụng MATLAB và Xử lý hình ảnh
Hộp công cụ có khả năng mô hình hóa các hiện tượng xuống cấp và hình thành các
giải pháp phục hồi. Như trong Chương 3 và 4, một số kỹ thuật khôi phục được xây
dựng tốt nhất trong miền không gian, trong khi những kỹ thuật khác phù hợp hơn
với miền tần số. Cả hai phương pháp được điều tra trong các phần tiếp theo. Chúng
tôi kết thúc chương với một cuộc thảo luận về phép biến đổi Radon và việc sử
dụng nó để tái tạo hình ảnh từ các phép chiếu.
5.1 Mô hình của quá trình phục hồi / suy thoái hình ảnh
Như Hình 5.1 cho thấy, quá trình suy giảm được mô hình hóa trong chương này
dưới dạng một hàm suy giảm, cùng với thuật ngữ nhiễu cộng, hoạt động trên hình
ảnh đầu vào f (x, y) để tạo ra hình ảnh suy giảm g (x, y):

Với g (x, y), một số kiến thức về hàm suy giảm H và một số kiến thức về thuật ngữ
nhiễu cộng n (x, y), mục tiêu của việc khôi phục là thu được một ước lượng, f (x,
y), của ảnh gốc. Chúng tôi muốn ước tính càng gần với hình ảnh đầu vào ban đầu
càng tốt. Nói chung, chúng ta càng biết nhiều về H và 17 (x, y), thì f (x, y) sẽ càng
gần f (x, y).
Nếu H là một quá trình tuyến tính, bất biến trong không gian, thì có thể chỉ ra rằng
hình ảnh suy giảm được cho trong miền không gian bởi

trong đó h (x, y) là biểu diễn không gian của hàm suy giảm và như trong Chương
3, ký hiệu "*" biểu thị tích chập. Chúng tôi biết từ cuộc thảo luận trong Phần 4.3. L
rằng tích chập trong miền không gian và phép nhân trong miền tần số tạo thành
một cặp biến đổi Fourier, vì vậy chúng ta có thể viết mô hình trước đó trong một
biểu diễn miền tần số tương đương:

trong đó các từ viết hoa là phép biến đổi Fourier của các từ tương ứng trong miền
không gian. Hàm suy giảm F (u, v) đôi khi được gọi là hàm truyền quang (OTF),
một thuật ngữ bắt nguồn từ phép phân tích Fourier của các hệ thống quang học.
Trong miền không gian, h (x, y) được gọi là hàm trải điểm (PSF), một thuật ngữ
phát sinh từ việc cho h (x, y) hoạt động trên một điểm sáng để thu được các đặc
điểm của suy giảm cho bất kỳ loại đầu vào. OTF và PSF là một cặp biến đổi
Fourier và hộp công cụ cung cấp hai hàm, otf2psf và psf2otf, để chuyển đổi giữa
chúng.
Vì sự suy giảm do hàm suy giảm tuyến tính, bất biến trong không gian, H, có thể
được mô hình hóa dưới dạng tích chập, nên đôi khi quá trình suy giảm được gọi là
"biến đổi hình ảnh bằng PSF." Tương tự. quá trình khôi phục đôi khi được gọi là
quá trình giải mã.
Trong ba phần sau, chúng tôi giả định rằng H là toán tử nhận dạng và chúng tôi chỉ
xử lý sự suy giảm do nhiễu. Bắt đầu từ Phần 5.6, chúng ta xem xét một số phương
pháp khôi phục ảnh khi có cả H và n.
HÌNH 5.1 Một mô hình của quá trình làm suy giảm / phục hồi hình ảnh.

5.2 Mô hình tiếng ồn


Khả năng mô phỏng hành vi và ảnh hưởng của nhiễu là trọng tâm của quá trình
khôi phục hình ảnh. Trong chương này, chúng ta quan tâm đến hai loại mô hình
nhiễu cơ bản: nhiễu trong miền không gian (được mô tả bằng hàm mật độ xác suất
nhiễu) và nhiễu trong miền tần số, được mô tả bằng các đặc tính Fourier khác nhau
của nhiễu. Ngoại trừ vật liệu trong Phần 5.2.3, chúng tôi giả định trong chương này
rằng nhiễu không phụ thuộc vào tọa độ ảnh.
5.2.1 Thêm nhiễu vào ảnh với chức năng imnoise
Hộp công cụ xử lý hình ảnh sử dụng chức năng imnoise để làm hỏng hình ảnh bị
nhiễu. Hàm này có cú pháp cơ bản:

trong đó f là hình ảnh đầu vào, và loại và các tham số như được giải thích bên
dưới. Hàm imnoise chuyển đổi hình ảnh đầu vào thành lớp kép trong phạm vi [0,1]
trước khi thêm nhiễu vào nó. Điều này phải được tính đến khi xác định các thông
số tiếng ồn. Ví dụ, để thêm nhiễu Gaussian có giá trị trung bình 64 và phương sai
400 vào hình ảnh uintB, chúng tôi chia tỷ lệ trung bình thành 64/255 và phương sai
thành 400 / (255) ^ 2 cho đầu vào imnoise. Các dạng cú pháp cho hàm này là:
 g = imnoise (f, 'gaussian', m, var) thêm nhiễu Gaussian của trung bình m và
phương sai var vào ảnh f. Giá trị mặc định là nhiễu trung bình bằng 0 với
phương sai 0,01.
 g = imnoise (f, 'localvar', V) thêm nhiễu Gaussian có giá trị 0 với phương sai
cục bộ V vào ảnh f, trong đó V là một mảng có cùng kích thước với f chứa
các giá trị phương sai mong muốn tại mỗi điểm.
 g = imnoise (f, 'localvar', image_intensity, va r) thêm zero-mean,Nhiễu
Gauss tới ảnh f, trong đó phương sai cục bộ của nhiễu, var, là một hàm của
các giá trị cường độ ảnh tính bằng f. Các đối số image_intensity và var là
các vectơ có cùng kích thước và biểu đồ (image_intensity, var) vẽ biểu đồ
mối quan hệ chức năng giữa phương sai nhiễu và cường độ ảnh. Vectơ ty
image_intensi phải chứa các giá trị cường độ chuẩn hóa trong phạm vi [0, 1].
 g = imnoise (f, 'salt & Pepper', d) làm hỏng hình ảnh f với muối và tiếng ồn
hạt tiêu, trong đó d là mật độ tiếng ồn (tức là phần trăm diện tích hình ảnh có
chứa các giá trị tiếng ồn). Do đó, khoảng d * numel (f) pixel bị ảnh hưởng.
Mặc định là mật độ nhiễu 0,05.
 g = imnoise (f, 's peckle', va r) thêm nhiễu nhân vào ảnh f, sử dụng phương
trình g = f + n. * f, trong đó n là nhiễu ngẫu nhiên phân bố đồng đều với giá
trị trung bình là 0 và phương sai var. Giá trị mặc định của var là 0,04.
 g = imnoise (f, 'poisson') tạo ra nhiễu Poisson từ dữ liệu thay vì thêm nhiễu
nhân tạo vào dữ liệu. Để tuân thủ thống kê Poisson, cường độ của ảnh uint8
và uint16 phải tương ứng với số photon (hoặc bất kỳ lượng tử thông tin nào
khác). Hình ảnh có độ chính xác kép được sử dụng khi số lượng photon trên
mỗi pixel lớn hơn 65535 (nhưng nhỏ hơn 10 ^ 12). Các giá trị cường độ thay
đổi từ 0 đến 1 và tương ứng với số photon chia cho 10 ^ 12.
Các phần sau đây minh họa các cách sử dụng khác nhau của hàm imnoise.
5.2.2 Tạo ra tiếng ồn ngẫu nhiên trong không gian với phân bố cụ thể
Thông thường, cần có khả năng tạo ra nhiễu của các loại và thông số ngoài những
thông số có sẵn trong hàm imnoise. Giá trị nhiễu không gian là các số ngẫu nhiên,
được đặc trưng bởi hàm mật độ xác suất (PDF) hoặc tương đương bởi hàm phân
phối tích lũy tương ứng (CDF). Việc tạo số ngẫu nhiên cho các loại phân phối mà
chúng ta quan tâm tuân theo một số quy tắc khá đơn giản từ lý thuyết xác suất.
Bộ tạo số ngẫu nhiên dựa trên việc biểu thị bài toán tạo dưới dạng các số ngẫu
nhiên có CDF đồng nhất trong khoảng (0, 1). Trong một số trường hợp, bộ tạo số
ngẫu nhiên cơ sở được lựa chọn là bộ tạo các số ngẫu nhiên Gaussian với phương
sai đơn vị và trung bình bằng 0. Mặc dù chúng ta có thể tạo ra hai loại nhiễu này
bằng cách sử dụng imnoise, trong bối cảnh hiện tại sẽ đơn giản hơn nếu sử dụng
hàm MATLAB cho các số ngẫu nhiên đồng nhất và randn cho các số ngẫu nhiên
bình thường (Gaussian). Các chức năng này được giải thích sau trong phần này.
Nền tảng của cách tiếp cận được mô tả trong phần này là một kết quả nổi tiếng từ
xác suất (Peebles [1993]) nói rằng, nếu w là một biến ngẫu nhiên có phân bố đồng
đều trong khoảng (0, 1), thì chúng ta có thể thu được một ngẫu nhiên biến z với
CDF, F xác định, bằng cách giải phương trình:

Kết quả đơn giản nhưng mạnh mẽ này có thể được phát biểu tương đương với việc
tìm ra nghiệm cho phương trình F (z) = w.
VÍ DỤ 5.1: Sử dụng các số ngẫu nhiên đồng nhất để tạo ra các số ngẫu nhiên có
phân phối xác định.
Giả sử rằng chúng ta có một bộ tạo các số ngẫu nhiên đồng nhất, w, trong khoảng
(0, 1) và giả sử rằng chúng ta muốn sử dụng nó để tạo các số ngẫu nhiên, z, với
Rayleigh CDF, có dạng

trong đó b> 0. Để tìm z ta giải phương trình

Vì số hạng căn bậc hai không âm, nên chúng tôi đảm bảo rằng không có giá trị nào
của z nhỏ hơn a được tạo ra, theo yêu cầu của định nghĩa Rayleigh CDF.
Do đó, một số ngẫu nhiên thống nhất w từ trình tạo của chúng ta có thể được sử
dụng trong phương trình trước để tạo ra một biến ngẫu nhiên z có phân phối
Rayleigh với các tham số a và b.
Trong MATLAB, kết quả này dễ dàng được tổng quát hóa thành một mảng, R, của
các số ngẫu nhiên bằng cách sử dụng biểu thức
trong đó, như đã thảo luận trong Phần 3.2.2, log là logarit tự nhiên và như được
giải thích ở phần sau của phần này, rand tạo ra các số ngẫu nhiên có phân bố đồng
đều trong khoảng (0, I). Nếu chúng ta để M = N = 1, thì dòng lệnh MATLAB trước
đó mang lại một giá trị duy nhất từ một biến ngẫu nhiên có phân phối Rayleigh
được đặc trưng bởi các tham số a và b.

Cách diễn đạt đôi khi được gọi là phương trình tạo số ngẫu nhiên
vì nó thiết lập cách tạo các số ngẫu nhiên mong muốn. Trong trường hợp cụ thể
này, chúng tôi có thể tìm thấy một giải pháp dạng đóng. Như sẽ được trình bày
ngay sau đây, điều này không phải lúc nào cũng có thể thực hiện được và vấn đề
sau đó trở thành một trong những việc tìm một phương trình tạo số ngẫu nhiên áp
dụng có kết quả đầu ra sẽ xấp xỉ số ngẫu nhiên với CDF được chỉ định.
Bảng 5.1 liệt kê các biến ngẫu nhiên được quan tâm trong cuộc thảo luận hiện tại,
cùng với tệp PDF, CDF và phương trình tạo số ngẫu nhiên của chúng. Trong một
số trường hợp, như với các biến Rayleigh và hàm mũ, có thể tìm thấy một nghiệm
dạng đóng cho CDF và nghịch đảo của nó. Điều này cho phép chúng ta viết một
biểu thức cho bộ tạo số ngẫu nhiên dưới dạng các số ngẫu nhiên đồng nhất, như
được minh họa trong Ví dụ 5.1. Trong những trường hợp khác, như trong trường
hợp của mật độ Gaussian và lognormal, không tồn tại các giải pháp dạng đóng cho
CDF, và cần phải tìm các cách thay thế để tạo ra các số ngẫu nhiên mong muốn. Ví
dụ, trong trường hợp lognormal, chúng tôi sử dụng kiến thức rằng một biến ngẫu
nhiên lognormal, z, sao cho ln (z) có phân phối Gaussian; điều này cho phép chúng
ta viết biểu thức trong Bảng 5.1 dưới dạng các biến ngẫu nhiên Gaussian với
phương sai đơn vị và trung bình bằng 0. Trong các trường hợp khác, việc định
dạng lại vấn đề để có được một giải pháp dễ dàng hơn là điều thuận lợi. Ví dụ, có
thể chỉ ra rằng các số ngẫu nhiên Erlang với các tham số a và b có thể nhận được
bằng cách thêm b các số ngẫu nhiên phân phối theo cấp số nhân có tham số a
(Leon-Garcia [1994]).
Các bộ tạo số ngẫu nhiên có sẵn trong imnoise và những bộ tạo trong Bảng 5.1
đóng một vai trò quan trọng trong việc mô hình hóa hành vi của nhiễu ngẫu nhiên
trong các ứng dụng xử lý ảnh. Chúng ta đã thấy sự hữu ích của phân phối đồng đều
để tạo ra các số ngẫu nhiên với các CDF khác nhau. Tiếng ồn Gaussian được sử
dụng như một giá trị gần đúng trong các trường hợp như cảm biến hình ảnh hoạt
động ở mức ánh sáng yếu. Tiếng ồn muối tiêu phát sinh trong các thiết bị chuyển
mạch bị lỗi. Kích thước của các hạt bạc trong nhũ tương nhiếp ảnh là một biến
ngẫu nhiên được mô tả bằng phân bố chuẩn. Nhiễu Rayleigh phát sinh trong ảnh
phạm vi, trong khi nhiễu theo cấp số nhân và nhiễu Erlang hữu ích trong việc mô tả
nhiễu trong ảnh laser.

Không giống như các loại nhiễu khác trong Bảng 5.1, nhiễu hạt tiêu thường được
xem là tạo ra một hình ảnh có ba giá trị, khi làm việc với tám bit, là 0 với xác suất
Pp, 255 với xác suất Ps và k với xác suất 1 - (Pp + Ps) với k là số bất kỳ giữa hai
điểm cực trị này. Cho ảnh nhiễu vừa mô tả được ký hiệu là r (x, y). Sau đó, chúng
tôi làm hỏng hình ảnh f (x, y) [có cùng kích thước với r (x, y)] với nhiễu hạt tiêu
bằng cách gán giá trị 0 cho tất cả các vị trí mà 0 xuất hiện trong r. Tương tự, chúng
ta gán 255 cho tất cả các vị trí trong f mà 255 xuất hiện trong r. Cuối cùng, chúng
ta không thay đổi trong f tất cả các vị trí trong đó r chứa giá trị k. Tên muối và hạt
tiêu phát sinh từ thực tế là 0 là màu đen và 255 là màu trắng trong hình ảnh 8 bit.
Mặc dù cuộc thảo luận trước đó dựa trên tám bit để đơn giản hóa giải thích, nhưng
cần rõ ràng rằng phương pháp này là chung và có thể áp dụng cho bất kỳ hình ảnh
nào có số mức cường độ tùy ý, miễn là chúng ta duy trì hai giá trị cực trị được chỉ
định là muối và tiêu . Chúng ta có thể tiến thêm một bước nữa và thay vì hai giá trị
cực trị, chúng ta có thể khái quát cuộc thảo luận trước đó thành hai dải giá trị cực
đoan, mặc dù đây không phải là điển hình trong hầu hết các ứng dụng.
Xác suất P, rằng một pixel bị hỏng do nhiễu hạt tiêu là
P = Pp + Ps Đây là thuật ngữ phổ biến để chỉ P là mật độ tiếng ồn. Ví dụ: nếu Pp =
0,02 và Ps = 0,01, chúng ta nói rằng khoảng 2% pixel trong hình ảnh bị hỏng do
nhiễu hạt tiêu, rằng I% bị hỏng do nhiễu muối và mật độ nhiễu là 0,03, nghĩa là
tổng số khoảng 3% pixel trong hình ảnh bị hỏng do nhiễu hạt tiêu.
Hàm M-function imnoise2 tùy chỉnh, được liệt kê sau trong phần này, tạo ra các số
ngẫu nhiên có CDF trong Bảng 5.1. Hàm này sử dụng hàm rand của MATLAB, có
cú pháp

Hàm này tạo ra một mảng có kích thước M x N có các mục nhập là các số được
phân bố đồng đều với các giá trị trong khoảng (0, 1). Nếu N bị bỏ qua, nó sẽ mặc
định là M. Nếu được gọi mà không có đối số, rand sẽ tạo ra một số ngẫu nhiên duy
nhất thay đổi mỗi khi hàm được gọi. Tương tự, hàm

tạo một mảng M x N có các phần tử là số bình thường (Gaussian) với phương sai
đơn vị và giá trị trung bình bằng 0. Nếu N bị bỏ qua, nó sẽ mặc định là M. Khi
được gọi mà không có đối số, randn tạo ra một số ngẫu nhiên.
Hàm imnoise2 cũng sử dụng hàm MATLAB f ind, có các dạng cú pháp sau:

Dạng đầu tiên trả về I các chỉ số tuyến tính (xem Phần 2.8.5) của tất cả các phần tử
khác không của A. Nếu không tìm thấy, f ind trả về một ma trận trống. Biểu mẫu
thứ hai trả về chỉ số hàng và cột của các mục khác không trong ma trận A. Ngoài
việc trả về chỉ số hàng và cột, biểu mẫu thứ ba cũng trả về các giá trị khác không
của A dưới dạng vectơ cột, v.
Dạng đầu tiên xử lý mảng A ở định dạng A (:), vì vậy I là một vectơ cột. Hình thức
này khá hữu ích trong việc xử lý ảnh. Ví dụ: để tìm và đặt thành 0 tất cả các pixel
trong hình ảnh có giá trị nhỏ hơn 128, chúng tôi viết:
Thao tác này cũng có thể được thực hiện bằng cách sử dụng lập chỉ mục logic
(xem Phần 2.8.4):

Nhớ lại rằng câu lệnh logic A <128 trả về 1 cho các phần tử của A thỏa mãn điều
kiện logic và 0 cho những phần tử không thỏa mãn điều kiện logic. Một ví dụ khác,
để đặt thành 128 tất cả các pixel trong khoảng [64, 192], chúng tôi viết

Tương tự, chúng ta có thể viết

Kiểu lập chỉ mục vừa thảo luận được sử dụng thường xuyên trong các chương còn
lại của cuốn sách.
mũ không được thu nhỏ theo bất kỳ cách nào. Một điểm khác biệt lớn nữa là
imnoise tạo ra hình ảnh nhiễu, trong khi imnoise2 tự tạo ra hình ảnh nhiễu. Người
dùng chỉ định trực tiếp các giá trị mong muốn cho các tham số nhiễu. Lưu ý rằng
mảng nhiễu do tiếng ồn muối tiêu có ba giá trị: 0 tương ứng với tiếng ồn hạt tiêu, 1
tương ứng với tiếng ồn muối và 0,5 tương ứng với tiếng ồn không. Mảng này cần
được xử lý thêm để làm cho nó trở nên hữu ích. Ví dụ, để làm hỏng một hình ảnh
với mảng này, chúng tôi tìm (sử dụng hàm tìm hoặc lập chỉ mục logic được minh
họa ở trên) tất cả các tọa độ trong R có giá trị 0 và đặt
tọa độ tương ứng trong ảnh đến giá trị mức xám nhỏ nhất có thể (thường là 0).
Tương tự, chúng ta tìm tất cả các tọa độ trong R có giá trị 1 và đặt tất cả các tọa độ
trong ảnh thành giá trị cao nhất có thể (thường là 255 đối với ảnh 8-bit). Tất cả các
pixel khác được giữ nguyên. Quá trình này mô phỏng cách thức mà nhiễu hạt tiêu
ảnh hưởng đến hình ảnh.
Quan sát trong mã cho imnoise2 cách các câu lệnh switch / case giữ đơn giản;
nghĩa là, trừ khi các tính toán trường hợp có thể được thực hiện với một dòng,
chúng được ủy quyền cho các chức năng riêng lẻ, riêng biệt được thêm vào cuối
chương trình chính. Điều này làm rõ luồng logic của mã. Cũng lưu ý cách tất cả
các giá trị mặc định được xử lý bởi một hàm riêng biệt, setDefaul ts, cũng được
thêm vào ở cuối chương trình chính. Mục tiêu là mô-đun hóa mã càng nhiều càng
tốt để dễ hiểu và bảo trì.
VÍ DỤ 5.2: Biểu đồ dữ liệu được tạo bởi hàm imnoise2.
Hình 5.2 cho thấy biểu đồ của tất cả các loại số ngẫu nhiên trong Bảng 5.1. Dữ liệu
cho mỗi ô được tạo bằng cách sử dụng hàm imnoise2. Ví dụ, dữ liệu cho Hình 5.2
(a) được tạo bởi lệnh sau:

Câu lệnh này đã tạo ra một vectơ cột, r, với 100000 phần tử, mỗi phần tử là một số
ngẫu nhiên từ phân phối Gaussian với giá trị trung bình là 0 và độ lệch chuẩn là 1.
Sau đó, một biểu đồ của biểu đồ được lấy bằng cách sử dụng hàm hist, có cú pháp
trong đó số thùng là số lượng thùng. Chúng tôi đã sử dụng bins = 50 để tạo biểu đồ
trong Hình 5.2. Các biểu đồ khác cũng được tạo theo cách tương tự. Trong mỗi
trường hợp, các tham số được chọn là giá trị mặc định được liệt kê trong phần giải
thích của hàm imnoise2.
5.2.3 Tiếng ồn định kỳ
Nhiễu định kỳ trong hình ảnh thường phát sinh do nhiễu điện và / hoặc điện cơ
trong quá trình thu nhận hình ảnh. Đây là loại nhiễu phụ thuộc không gian duy nhất
mà chúng ta xem xét trong chương này. Như đã thảo luận trong Phần 5.4, nhiễu
định kỳ thường được xử lý bằng cách lọc trong miền tần số. Mô hình nhiễu tuần
hoàn của chúng tôi là một hình sin rời rạc 2-D với phương trình
với x = 0, 1, 2, ..., M - 1 và y = 0, 1, 2, ..., N - 1, trong đó A là biên độ, u0 và v0
xác định các tần số hình sin đối với Trục x- và y tương ứng, Bx và By là các dịch
chuyển pha đối với gốc tọa độ. DFf của phương trình này là

cho u = 0, 1, 2, ..., M - 1 và v = 0, 1, 2 ,. . . , N - 1, mà chúng ta thấy là một cặp


xung đơn vị liên hợp phức tạp đặt tại (u + u0, v + v0) và (u -u0, v - v0), tương ứng.
Nói cách khác, số hạng đầu tiên bên trong dấu ngoặc trong phương trình trước
bằng không trừ khi u = -u0 và v = - v0, và số hạng thứ hai bằng 0 trừ khi u = u0 và
v = v0.
Hàm M sau đây chấp nhận một số vị trí xung (tọa độ tần số) tùy ý, mỗi vị trí có
biên độ, tần số và tham số dịch pha riêng và tính r (x, y) là tổng các hình sin có
dạng được mô tả ở phần trước đoạn văn. Hàm cũng xuất ra phép biến đổi Fourier,
R (u, v), của tổng các hình lồi và phổ của R (u, v). Các sóng sin được tạo ra từ
thông tin vị trí xung đã cho thông qua DFf nghịch đảo. Điều này làm cho nó trực
quan hơn và đơn giản hóa việc hình dung nội dung tần số trong mô hình nhiễu
không gian. Chỉ cần một cặp tọa độ để xác định vị trí của một xung. Chương trình
tạo ra các xung đối xứng liên hợp. Lưu ý trong mã việc sử dụng hàm i fftshi ft để
chuyển đổi R ở giữa thành cách sắp xếp dữ liệu thích hợp cho hoạt động i fft2, như
đã thảo luận trong Phần 4.2.
VÍ DỤ 5.3: Sử dụng hàm imnoise3.
Hình 5.3 (a) và (b) cho thấy phổ và mẫu nhiễu hình sin không gian được tạo ra
bằng cách sử dụng các lệnh sau:
Như đã đề cập trong các chú thích của hàm imnoise3, tọa độ (u, v) của các xung
được xác định đối với tâm của hình chữ nhật tần số (xem Phần 4.2 để biết thêm chi
tiết về tọa độ của điểm trung tâm này). Hình 5.3 (c) và (d) cho thấy kết quả thu
được bằng cách lặp lại các lệnh trước đó, nhưng với
Tương tự, Hình 5.3 (e) thu được với

Hình 5.3 (f) được tạo với cùng một C, nhưng sử dụng vectơ biên độ không mặc
định

Như Hình 5.3 (f) cho thấy, sóng sin tần số thấp hơn chiếm ưu thế trong hình ảnh.
Điều này đúng như mong đợi vì biên độ của nó gấp năm lần biên độ của thành
phần tần số cao hơn.
5.2.4 Ước tính các thông số tiếng ồn
Các thông số của tiếng ồn tuần hoàn thường được ước tính bằng cách phân tích
phổ Fourier. Tiếng ồn định kỳ tạo ra các đột biến tần số mà thường có thể được
phát hiện ngay cả bằng cách kiểm tra bằng mắt. Có thể phân tích tự động khi các
xung nhiễu được phát âm đủ hoặc khi có sẵn một số kiến thức về tần số của nhiễu.
Trong trường hợp nhiễu trong miền không gian, các thông số của PDF có thể được
biết một phần từ các thông số kỹ thuật của cảm biến, nhưng có thể cần ước lượng
chúng từ các hình ảnh mẫu. Mối quan hệ giữa giá trị trung bình, m và phương sai,
, của nhiễu, và các tham số a và b cần thiết để xác định hoàn toàn các tệp PDF
quan tâm trong chương này được liệt kê trong Bảng 5.1. Do đó, bài toán trở thành
một trong những ước lượng giá trị trung bình và phương sai từ (các) hình ảnh mẫu
và sau đó sử dụng những ước lượng này để giải câu a và b.
Gọi zi, là một biến ngẫu nhiên rời rạc biểu thị các mức cường độ trong một hình
ảnh và đặt p (Zi), i = 0, 1, 2, ..., L - 1, là biểu đồ chuẩn hóa tương ứng, trong đó L
là số của các giá trị cường độ có thể. Thành phần biểu đồ, p (zi), là một ước tính
xác suất xuất hiện của giá trị cường độ Zi và biểu đồ có thể được xem như một xấp
xỉ rời rạc của cường độ PDF.
Một trong những cách tiếp cận chính để mô tả hình dạng của biểu đồ là sử dụng
các khoảnh khắc trung tâm của nó (còn gọi là khoảnh khắc về giá trị trung bình),
được định nghĩa là
trong đó n là thứ tự thời điểm và m là giá trị trung bình:

Bởi vì biểu đồ được giả định là chuẩn hóa, tổng của tất cả các thành phần của nó là
1, do đó, từ các phương trình trước đó, µ0 = 1 và µ1 = 0. Thời điểm thứ hai,

là phương sai. Trong chương này, chúng tôi chỉ quan tâm đến giá trị trung bình và
phương sai. Các khoảnh khắc bậc cao được thảo luận trong Chương 12.
Các trạng thái của hàm tính toán các thời điểm trung bình và trung tâm theo thứ tự
n và trả về chúng trong vectơ hàng v. Bởi vì thời điểm của bậc 0 luôn là 1 và thời
điểm của bậc 1 luôn là 0 nên các trạng thái bỏ qua hai thời điểm này và thay vào đó
để v (1) = m và v (k) = µk với k = 2, 3, ..., n. Cú pháp như sau (xem Phụ lục C để
biết mã):

trong đó p là vectơ biểu đồ và n là số khoảnh khắc cần tính toán. Yêu cầu số lượng
thành phần của p phải bằng 2 ^ 8 đối với ảnh lớp uint8, 2 ^ 16 đối với ảnh lớp
uint16 và 2 ^ 8 hoặc 2 ^ 16 đối với ảnh thuộc lớp đơn hoặc kép. Vectơ đầu ra v
chứa các mômen chuẩn hóa. Hàm chia tỷ lệ biến ngẫu nhiên thành phạm vi [0, 1],
vì vậy tất cả các khoảnh khắc cũng nằm trong phạm vi này. Vector unv chứa các
khoảnh khắc giống như v, nhưng được tính toán với dữ liệu trong phạm vi giá trị
ban đầu của nó. Ví dụ: nếu length (p) = 256 và v (1) = 0,5, thì unv (1) sẽ có giá trị
1 27. 5, là một nửa của phạm vi [0, 255].
Thông thường, các thông số nhiễu phải được ước tính trực tiếp từ một hình ảnh
hoặc tập hợp các hình ảnh nhiễu nhất định. Trong trường hợp này, cách tiếp cận là
chọn một vùng trong ảnh có nền càng đặc sắc càng tốt, sao cho sự thay đổi của các
giá trị cường độ trong vùng chủ yếu là do nhiễu. Để chọn một vùng quan tâm
(ROI) trong MATLAB, chúng tôi sử dụng hàm roipoly, tạo ROI đa giác. Hàm này
có cú pháp cơ bản
trong đó f là ảnh quan tâm, và c và r là các vectơ của tọa độ cột và hàng tương ứng
(tuần tự) của các đỉnh của đa giác (lưu ý rằng các cột được chỉ định trước). Gốc tọa
độ của các đỉnh nằm trên cùng, bên trái. Đầu ra, B, là một hình ảnh nhị phân có
cùng kích thước với f với Os bên ngoài ROI và ls bên trong. Hình ảnh B thường
được sử dụng như một mặt nạ để giới hạn các hoạt động trong khu vực quan tâm.
Để chỉ định ROI đa giác một cách tương tác, chúng tôi sử dụng cú pháp

hiển thị hình ảnh f trên màn hình và Jets người dùng chỉ định một đa giác bằng
cách sử dụng chuột. Nếu bỏ qua f, roipoly sẽ hoạt động trên hình ảnh cuối cùng
được hiển thị. Bảng 5.2 liệt kê các khả năng tương tác khác nhau của chức năng
roipoly. Khi bạn hoàn thành việc định vị và định kích thước cho đa giác, bạn có thể
tạo mặt nạ B bằng cách nhấp đúp hoặc nhấp chuột phải vào bên trong vùng và
chọn Tạo mặt nạ từ menu ngữ cảnh
Để có được hình ảnh nhị phân và danh sách các đỉnh của đa giác, chúng tôi sử
dụng cú pháp

trong đó roipoly (...) cho biết bất kỳ dạng cú pháp hợp lệ nào cho hàm này và như
trước đây, c và r là tọa độ cột và hàng của các đỉnh. Định dạng này đặc biệt hữu ích
khi ROI được chỉ định một cách tương tác vì nó cung cấp tọa độ của các đỉnh đa
giác để sử dụng trong các chương trình khác hoặc để sao chép cùng một ROI sau
này.
Hàm sau tính toán biểu đồ của ROI có các đỉnh được xác định bởi vectơ c và r, như
trong phần thảo luận trước. Lưu ý việc sử dụng hàm roipoly trong chương trình để
sao chép vùng đa giác được xác định bởi c và r.

VÍ DỤ 5.4: Ước tính các thông số tiếng ồn.


Hình 5.4 (a) cho thấy một hình ảnh nhiễu, ký hiệu là f trong phần thảo luận sau.
Mục tiêu của ví dụ này là ước tính loại nhiễu và các tham số của nó bằng cách sử
dụng các kỹ thuật vừa thảo luận. Hình 5.4 (b) cho thấy một mặt nạ, B, được tạo
bằng cách sử dụng lệnh tương tác:
>> [B, c, r] = roipoly (f) ;

Hình 5.4 (c) được tạo bằng các lệnh


>> [h, npix ] = hist roi (f, c, r ) ;

>> figure , bar (h, 1)

Giá trị trung bình và phương sai của vùng được che bởi B thu được như sau:
chọn một khu vực có mức nền gần như không đổi (như chúng tôi đã làm ở đây) và
giả sử rằng tiếng ồn là phụ gia, chúng tôi có thể ước tính rằng cường độ trung bình
của khu vực trong ROI hợp lý gần với mức xám trung bình của hình ảnh trong khu
vực đó không có tiếng ồn, chỉ ra rằng tiếng ồn trong trường hợp này có giá trị bằng
không. Ngoài ra, thực tế là khu vực có mức cường độ gần như không đổi cho
chúng ta biết rằng sự thay đổi trong khu vực trong ROI chủ yếu là do phương sai
của tiếng ồn. (Khi khả thi, một cách khác để ước tính giá trị trung bình và phương
sai của nhiễu là chụp ảnh mục tiêu có hệ số phản xạ không đổi, đã biết.) Hình 5.4
(d) cho thấy biểu đồ của một tập hợp npix (số này được trả về bởi hist roi)
Gaussian biến ngẫu nhiên sử dụng giá trị trung bình là 147 và phương sai là 400
(xấp xỉ các giá trị được tính ở trên), thu được bằng các lệnh sau:

trong đó số lượng thùng trong lịch sử được chọn để kết quả tương thích với biểu đồ
trong Hình 5.4 (c). Biểu đồ trong hình này thu được trong hàm histroi bằng cách sử
dụng imhist, sử dụng một tỷ lệ khác với hist. Chúng tôi đã chọn một tập hợp các
biến ngẫu nhiên npix để tạo X, sao cho số lượng mẫu là như nhau trong cả hai biểu
đồ. Sự giống nhau giữa các Hình. 5.4 (c) và (d) chỉ ra rõ ràng rằng nhiễu thực sự
được xấp xỉ tốt bởi phân bố Gauss với các tham số gần với các ước lượng v (1) và
v (2).
5.3 Phục hồi sự hiện diện của bộ lọc không gian chỉ tiếng ồn
Khi sự suy giảm duy nhất hiện nay là tiếng ồn, nó theo mô hình trong Phần 5.1
rằng

Phương pháp được lựa chọn để giảm nhiễu trong trường hợp này là lọc không gian,
sử dụng các kỹ thuật được phát triển trong Phần 3.4 và 3.5. Trong phần này, chúng
tôi tóm tắt và triển khai một số bộ lọc không gian để giảm nhiễu. Chi tiết bổ sung
về các đặc điểm của các bộ lọc này được thảo luận trong Gonzalez và Woods
[2008].
5.3.1 Bộ lọc tiếng ồn không gian
Bảng 5.3 liệt kê các bộ lọc không gian quan tâm trong phần này, trong đó Sxy biểu
thị m x n hình ảnh con (vùng) của hình ảnh nhiễu đầu vào, g. Các chỉ số con trên S
chỉ ra rằng hình ảnh con được căn giữa tại các tọa độ (x, y) và f (x, y) (ước tính của
f) biểu thị phản hồi của bộ lọc tại các tọa độ đó. Các bộ lọc tuyến tính được thực
hiện bằng cách sử dụng bộ lọc hàm được thảo luận trong Phần 3.4. Các bộ lọc
trung bình, tối đa và tối thiểu là các bộ lọc thống kê đơn hàng, phi tuyến. Bộ lọc
trung vị có thể được triển khai trực tiếp bằng cách sử dụng hàm hộp công cụ
medfilt2. Các bộ lọc tối đa và tối thiểu được thực hiện bằng cách sử dụng các hàm
imdilate và imerode được thảo luận trong Phần 10.2.
Hàm tùy chỉnh sau, mà chúng tôi gọi là spf il t, thực hiện lọc trong miền không
gian bằng cách sử dụng bất kỳ bộ lọc nào được liệt kê trong Bảng 5.3. Lưu ý việc
sử dụng hàm imlincomb (được đề cập trong Phần 2.10.2) để tính tổ hợp tuyến tính
của các đầu vào. Cũng lưu ý cách hàm tof loat (xem Phần 2.7) được sử dụng để
chuyển đổi hình ảnh đầu ra sang cùng lớp với đầu vào.
VÍ DỤ 5.5: Sử dụng hàm spfilt.
Hình ảnh trong Hình 5.5 (a) là hình ảnh uintB bị nhiễu hạt tiêu chỉ với xác suất 0,1.
Hình ảnh này được tạo bằng các lệnh sau [f là hình ảnh từ Hình 3.19 (a)]:

Hình ảnh trong Hình 5.5 (b) đã bị hỏng do nhiễu muối chỉ sử dụng các câu lệnh

Một cách tiếp cận tốt để lọc nhiễu hạt tiêu là sử dụng bộ lọc đối âm với giá trị
dương là Q. Hình 5.5 (c) được tạo bằng cách sử dụng câu lệnh

Tương tự, tiếng ồn muối có thể được lọc bằng cách sử dụng bộ lọc tương phản có
giá trị âm là Q:
Hình 5.5 (d) cho thấy kết quả. Có thể thu được các kết quả tương tự khi sử dụng
các bộ lọc tối đa và tối thiểu. Ví dụ, các hình ảnh trong Figs. 5.5 (e) và (f) được tạo
ra từ Hình. 5.5 (a) và (b) tương ứng với các lệnh sau:

Các giải pháp khác sử dụng spf il t được thực hiện theo cách tương tự.
5.3.2 Bộ lọc không gian thích ứng
Các bộ lọc được thảo luận trong phần trước được áp dụng cho một hình ảnh một
cách độc lập với cách các đặc điểm của hình ảnh thay đổi từ vị trí này sang vị trí
khác. Trong một số ứng dụng, kết quả có thể được cải thiện bằng cách sử dụng các
bộ lọc có khả năng điều chỉnh hành vi của chúng dựa trên các đặc điểm của hình
ảnh trong vùng được lọc. Như một minh họa về cách triển khai bộ lọc không gian
thích ứng trong MATLAB, chúng tôi xem xét trong phần này là bộ lọc trung vị
thích ứng. Như trước đây, Sty biểu thị một hình ảnh con được căn giữa tại vị trí (x,
y) trong hình ảnh đang được xử lý. Thuật toán, do Eng và Ma [2001] và được giải
thích chi tiết trong Gonzalez và Woods [2008], như sau. Để cho
Thuật toán lọc trung vị thích ứng sử dụng hai cấp độ xử lý, được ký hiệu là cấp A
và cấp B
trong đó Smax biểu thị kích thước tối đa được phép của cửa sổ bộ lọc thích ứng.
Một tùy chọn khác trong bước cuối cùng trong Cấp A là xuất Zxy. thay vì dải phân
cách. Điều này tạo ra kết quả ít bị mờ hơn một chút nhưng có thể không phát hiện
được nhiễu hạt tiêu (hạt tiêu) được nhúng trong nền không đổi có cùng giá trị với
tiếng ồn hạt tiêu (muối).
Một hàm M triển khai thuật toán này, mà chúng tôi gọi là adpmedian, được bao
gồm trong Phụ lục C. Cú pháp là

trong đó g là hình ảnh được lọc và như đã định nghĩa ở trên, Smax là kích thước tối
đa cho phép của cửa sổ bộ lọc thích ứng.
VÍ DỤ 5.6: Lọc trung vị thích ứng.
Hình 5.6 (a) cho thấy hình ảnh bảng mạch, f, bị hỏng do nhiễu hạt tiêu được tạo ra
bằng lệnh

và Hình 5.6 (b) cho thấy kết quả thu được bằng lệnh

Hình ảnh này không bị nhiễu ở mức hợp lý, nhưng khá mờ và bị méo (ví dụ: xem
các ngón tay nối ở giữa trên cùng của hình ảnh). Mặt khác, lệnh

mang lại hình ảnh trong Hình 5.6 (c), cũng không bị nhiễu, nhưng ít bị mờ và méo
hơn đáng kể so với Hình 5.6 (b).
5.4 Giảm tiếng ồn định kỳ bằng cách sử dụng bộ lọc miền tần số
Như đã lưu ý trong Phần 5.2.3, nhiễu tuần hoàn tạo ra các vụ nổ giống như xung
thường có thể nhìn thấy trong phổ Fourier. Phương pháp chính để lọc các thành
phần này là sử dụng lọc đối tượng khía cạnh. Như đã thảo luận trong Phần 4.7.2,
biểu thức chung cho bộ lọc đối tượng khía có cặp khía Q là

trong đó Hk (u, v) và H-k (u, v) là các bộ lọc thông cao với các tâm lần lượt là (uk,
vk) và (-uk, -vk). Các tâm dịch này được xác định đối với tâm của hình chữ nhật
tần số, (M / 2, N / 2). Do đó, các phép tính khoảng cách cho các bộ lọc được đưa ra
bởi biểu thức

Chúng tôi thảo luận về một số loại bộ lọc notchreject trong Phần 4.7.2 và đưa ra
một chức năng tùy chỉnh, cnotch, để tạo các bộ lọc này. Một trường hợp đặc biệt
của lọc đối tượng khía cạnh làm tách các thành phần dọc theo trục tần số cũng
được sử dụng để phục hồi hình ảnh. Hàm recnotch được thảo luận trong Phần 4.7.2
triển khai loại bộ lọc này. Ví dụ 4.9 và 4.10 chứng minh hiệu quả của lọc nhiễu đối
tượng để giảm tiếng ồn định kỳ.
5.5 Mô hình hóa chức năng suy thoái
Khi có thiết bị tương tự như thiết bị tạo ra hình ảnh giảm chất lượng, đôi khi có thể
xác định bản chất của sự suy giảm bằng cách thử nghiệm với các cài đặt thiết bị
khác nhau. Tuy nhiên, sự sẵn có của thiết bị hình ảnh liên quan là ngoại lệ, chứ
không phải là quy luật, trong giải pháp cho các vấn đề khôi phục hình ảnh và cách
tiếp cận điển hình là thử nghiệm bằng cách tạo PSF và kiểm tra kết quả bằng các
thuật toán khôi phục khác nhau. Một cách tiếp cận khác là cố gắng lập mô hình
toán học PSF. Cách tiếp cận này nằm ngoài xu hướng chính của cuộc thảo luận của
chúng tôi ở đây; để biết phần giới thiệu về chủ đề này, xem Gonzalez và Woods
[2008]. Cuối cùng, khi không có thông tin về PSF, chúng ta có thể sử dụng "giải
mã mù" để suy ra PSF. Cách tiếp cận này được thảo luận trong Phần 5.10. Trọng
tâm của phần còn lại của phần này là về các kỹ thuật khác nhau để lập mô hình
PSF bằng cách sử dụng các hàm imf il ter và fspecial, được giới thiệu trong Phần
3.4 và 3.5, và các hàm tạo nhiễu khác nhau được thảo luận trước đó trong chương
này.
Một trong những suy giảm chính gặp phải trong các vấn đề khôi phục hình ảnh là
hình ảnh mờ. Hiện tượng mờ xảy ra với cảnh và cảm biến ở trạng thái nghỉ đối với
nhau có thể được mô hình hóa bằng các bộ lọc thông thấp miền tần số hoặc không
gian. Một mô hình suy giảm quan trọng khác là hiện tượng nhòe ảnh do chuyển
động thẳng đều giữa cảm biến và cảnh trong quá trình thu nhận ảnh. Làm mờ hình
ảnh có thể được mô hình hóa bằng cách sử dụng chức năng hộp công cụ f đặc biệt:

Lệnh gọi đến fspecial này trả về một PSF ước tính các ảnh hưởng của chuyển động
thẳng của máy ảnh theo len pixel. Tham số theta tính bằng độ, được đo so với trục
hoành dương theo hướng ngược chiều kim đồng hồ. Giá trị mặc định của len và
theta lần lượt là 9 và 0. Các cài đặt này tương ứng với chuyển động của 9 pixel
theo hướng ngang.
Chúng tôi sử dụng hàm imfilter để tạo hình ảnh bị giảm chất lượng với PSF đã biết
hoặc được tính toán bằng cách sử dụng phương pháp vừa mô tả:

trong đó 'hình tròn' (Bảng 3.2) được sử dụng để giảm hiệu ứng đường viền. Sau đó,
chúng tôi hoàn thành mô hình hình ảnh đã xuống cấp bằng cách thêm nhiễu, nếu
thích hợp:
trong đó nhiễu là hình ảnh nhiễu ngẫu nhiên có cùng kích thước với g, được tạo ra
bằng một trong các phương pháp được thảo luận trong Phần 5.2.
Khi so sánh mức độ phù hợp của các phương pháp tiếp cận khác nhau được thảo
luận trong phần này và phần sau, sẽ hữu ích khi sử dụng cùng một hình ảnh hoặc
mẫu thử nghiệm để các so sánh có ý nghĩa. Mẫu thử nghiệm được tạo bởi bảng
kiểm tra chức năng đặc biệt hữu ích cho mục đích này vì kích thước của nó có thể
được thu nhỏ mà không ảnh hưởng đến các tính năng chính của nó. Cú pháp là

trong đó NP là số pixel trên mỗi cạnh của mỗi hình vuông, M là số hàng và N là số
cột. Nếu N bị bỏ qua, nó mặc định là M. Nếu cả M và N bị bỏ qua, một bàn cờ
vuông có 8 ô vuông bên cạnh được tạo ra. Ngoài ra, nếu NP bị bỏ qua, nó sẽ mặc
định là 10 pixel. Các ô sáng ở nửa bên trái của bàn cờ có màu trắng. Các ô sáng ở
nửa bên phải của bàn cờ có màu xám. Để tạo một bàn cờ trong đó tất cả các ô sáng
màu trắng, chúng ta sử dụng lệnh

Các hình ảnh do bàn cờ tạo ra thuộc loại kép với các giá trị trong phạm vi [0, 1].
Vì một số thuật toán khôi phục chậm đối với các hình ảnh lớn, nên một cách tiếp
cận tốt là thử nghiệm với các hình ảnh nhỏ để giảm thời gian tính toán. Trong
trường hợp này, rất hữu ích cho mục đích hiển thị để có thể thu phóng hình ảnh
bằng cách sao chép pixel. Hàm sau thực hiện điều này (xem Phụ lục C để biết mã):

Hàm này nhân bản mọi pixel trong A tổng cộng m lần theo hướng dọc và n lần
theo hướng ngang. Nếu n bị bỏ qua, nó mặc định là m.
VÍ DỤ 5.7: Lập mô hình ảnh bị mờ, nhiễu.
Hình 5.7 (a) cho thấy hình ảnh bàn cờ được tạo bởi lệnh

Hình ảnh bị suy giảm trong Hình 5.7 (b) được tạo bằng các lệnh

PSF là một bộ lọc không gian. Giá trị của nó là


Dạng nhiễu trong Hình 5.7 (c) là hình ảnh nhiễu Gaussian với giá trị trung bình là
0 và phương sai 0,001. Nó được tạo bằng lệnh

Hình ảnh nhiễu mờ trong Hình 5.7 (d) được tạo ra


Ảnh này không dễ nhìn thấy nhiễu vì giá trị lớn nhất của nó là xấp xỉ 0,15, trong
khi giá trị lớn nhất của ảnh là 1. Như sẽ được trình bày trong Phần 5.7 và 5.8, tuy
nhiên, mức độ nhiễu này không đáng kể khi cố gắng khôi phục g. Cuối cùng,
chúng tôi chỉ ra rằng tất cả các hình ảnh trong Hình 5.7 đã được thu phóng đến
kích thước 512 x 512 và được hiển thị bằng lệnh của biểu mẫu

Hình ảnh trong Hình 5.7 (d) được khôi phục trong Ví dụ 5.8 và 5.9.
5.6 Lọc ngược trực tiếp
Cách tiếp cận đơn giản nhất mà chúng ta có thể thực hiện để khôi phục một hình
ảnh bị suy giảm chất lượng là bỏ qua thuật ngữ nhiễu trong mô hình được giới
thiệu trong Phần 5.1 và hình thành một ước lượng của dạng

Sau đó, chúng ta có được ước lượng tương ứng của ảnh bằng cách lấy biến đổi
Fourier ngược của F (u, v) [nhớ lại rằng G (u, v) là biến đổi Fourier của ảnh suy
giảm]. Cách tiếp cận này được gọi một cách thích hợp là lọc nghịch đảo. Có tính
đến tiếng ồn, chúng tôi có thể đưa ra ước tính của mình là

Biểu thức đơn giản dễ bị lừa dối này cho chúng ta biết rằng, ngay cả khi chúng ta
biết chính xác H (u, v), chúng ta không thể khôi phục F (u, v) [và do đó hình ảnh
ban đầu, không được đánh giá cao f (x, y)] vì thành phần nhiễu là một hàm ngẫu
nhiên có biến đổi Fourier, N (u, v), không được biết đến. Ngoài ra, thường có một
vấn đề trong thực tế với hàm H (u, v) có nhiều số không. Ngay cả khi thuật ngữ
nhiễu N (u, v) không đáng kể, việc chia nó cho các giá trị biến mất của H (u, v) sẽ
chiếm ưu thế trong các ước tính khôi phục.
Cách tiếp cận điển hình khi cố gắng lọc ngược là tạo thành tỷ lệ F (u, v) = G (u,
v) / H (u, v) và sau đó giới hạn dải tần số để thu được nghịch đảo, thành các tần số
"gần" điểm gốc. . Ý tưởng là các số không trong H (u, v) ít có khả năng xảy ra gần
điểm gốc hơn vì độ lớn của phép biến đổi thường ở giá trị cao nhất của nó trong
vùng đó. Có rất nhiều biến thể của chủ đề cơ bản này, trong đó cách xử lý đặc biệt
được đưa ra ở các giá trị (u, v) mà H là 0 hoặc gần 0. Loại phương pháp này đôi
khi được gọi là lọc giả ngược. Nói chung, các cách tiếp cận dựa trên lọc nghịch đảo
kiểu này hiếm khi thực tế, như Ví dụ 5.8 trong phần tiếp theo cho thấy.
5.7 Lọc tiếng Viên
Lọc Wiener (sau N. Wiener, người đầu tiên đề xuất phương pháp này vào năm
1942) là một trong những cách tiếp cận sớm nhất và được biết đến nhiều nhất để
khôi phục ảnh tuyến tính. Bộ lọc Wiener tìm kiếm ước tính f để giảm thiểu hàm lỗi
thống kê

trong đó E là toán tử giá trị mong đợi và f là hình ảnh chưa được phân cấp. Giải
pháp cho biểu thức này trong miền tần số là

Where

Tỷ số được gọi là tỷ số công suất nhiễu trên tín hiệu. Chúng ta thấy
rằng nếu phổ công suất nhiễu bằng 0 đối với tất cả các giá trị liên quan của u và v,
tỷ lệ này sẽ trở thành 0 và bộ lọc Wiener giảm thành bộ lọc nghịch đảo đã thảo
luận trong phần trước.
Hai đại lượng liên quan được quan tâm là công suất nhiễu trung bình và công suất
hình ảnh trung bình, được định nghĩa là
trong đó, như thường lệ, M và N lần lượt biểu thị số hàng và cột của ảnh và mảng
nhiễu. Những đại lượng này là hằng số vô hướng và tỷ lệ của chúng,

cũng là một đại lượng vô hướng, đôi khi được sử dụng để tạo ra một mảng không
đổi thay cho hàm . Trong trường hợp này, ngay cả khi tỷ lệ thực
không được biết, nó sẽ trở thành một vấn đề đơn giản để thử nghiệm tương tác
bằng cách thay đổi R và xem kết quả được khôi phục. Tất nhiên, đây là một phép
gần đúng thô thiển giả định rằng các hàm là không đổi. Thay thế
bằng một mảng hằng số trong phương trình bộ lọc trước dẫn đến cái gọi là bộ lọc
Wiener tham số. Như được minh họa trong Ví dụ 5.8, ngay cả hành động đơn giản
là sử dụng một mảng hằng số cũng có thể mang lại những cải tiến đáng kể so với
lọc ngược trực tiếp.
Lọc Wiener được thực hiện bởi chức năng Hộp công cụ xử lý hình ảnh deconvwn
r, có ba dạng cú pháp có thể có. Trong cả ba dạng, g biểu thị ảnh bị suy giảm và f
còn lại là ảnh được khôi phục. Dạng cú pháp đầu tiên,

giả định rằng tỷ lệ nhiễu trên tín hiệu bằng không. Do đó, dạng bộ lọc Wiener này
là bộ lọc nghịch đảo được thảo luận trong Phần 5.6. Cú pháp

giả định rằng tỷ lệ công suất nhiễu trên tín hiệu được biết đến, dưới dạng một hằng
số hoặc một mảng; hàm chấp nhận một trong hai. Đây là cú pháp được sử dụng để
triển khai bộ lọc Wiener tham số, trong trường hợp đó NSPR sẽ là đầu vào vô
hướng. Cuối cùng, cú pháp

giả định rằng các hàm tự tương quan, NACORR và FACORR, của nhiễu và hình
ảnh chưa được phân cấp đã được biết đến. Lưu ý rằng dạng r deconvwn này sử
dụng tự tương quan của T / và f thay vì phổ công suất của các hàm này. Từ định lý
tương quan, chúng ta biết rằng
trong đó "sao" biểu thị phép toán tương quan và. biểu thị phép biến đổi Fourier.
Biểu thức này chỉ ra rằng chúng ta có thể thu được hàm tự tương quan, f (x, y)
"sao" f (x, y), để sử dụng trong r deconvwn bằng cách tính toán biến đổi Fourier
ngược của phổ công suất. Các nhận xét tương tự giữ nguyên cho sự tự tương quan
của nhiễu.
Nếu hình ảnh được khôi phục thể hiện tiếng chuông được giới thiệu bởi phép biến
đổi Fourier rời rạc được sử dụng trong thuật toán, đôi khi nó sẽ giúp sử dụng hàm
edgetaper trước khi gọi deconvwnr. Cú pháp là

VÍ DỤ 5.8: Sử dụng hàm deconvwnr để khôi phục hình ảnh bị mờ, nhiễu.
Hình 5.8 (a) được tạo theo cách tương tự như Hình 5.7 (d) và Hình 5.8 (b) được tạo
bằng lệnh

trong đó g là hình ảnh bị hỏng và PSF là hàm trải điểm được tính trong Ví dụ 5.7.
Như đã lưu ý trước đó trong phần này, f rest1 là kết quả của phép lọc nghịch đảo
trực tiếp và như mong đợi, kết quả bị chi phối bởi ảnh hưởng của nhiễu. (Như
trong Ví dụ 5.7, tất cả các hình ảnh được hiển thị đã được xử lý với pixeldup để thu
phóng kích thước của chúng lên 512 X 512 pixel.)
Tỷ lệ, R, được thảo luận trước đó trong phần này, thu được bằng cách sử dụng ảnh
gốc và ảnh nhiễu từ Ví dụ 5.7:
Để khôi phục hình ảnh bằng cách sử dụng tỷ lệ này, chúng tôi viết

Như Hình 5.S (c) cho thấy, phương pháp này mang lại một cải tiến đáng kể so với
lọc nghịch đảo trực tiếp.
Cuối cùng, chúng tôi sử dụng các hàm tự tương quan trong việc khôi phục (lưu ý
sử dụng fftshift để căn giữa):

Như Hình 5.8 (d) cho thấy, kết quả gần hơn nhiều so với ban đầu, nhưng một số
nhiễu vẫn còn rõ ràng. Bởi vì ảnh gốc và các hàm nhiễu đã được biết đến, chúng
tôi có thể ước tính các tham số chính xác và Hình 5.8 (d) là hình ảnh tốt nhất có thể
thực hiện được với giải mã Wiener trong trường hợp này. Thách thức trong thực tế,
khi một (hoặc nhiều) trong số các đại lượng này không được biết trước, là việc lựa
chọn các hàm được sử dụng trong thực nghiệm, cho đến khi thu được kết quả chấp
nhận được.
5.8 Lọc hình vuông nhỏ nhất có giới hạn (chính quy)

You might also like