Làm thế nào để bạn thêm một gaussian blur trong python?

Đến cuối hướng dẫn này, bạn sẽ có thể tự tin áp dụng các chức năng làm mờ của OpenCV cho hình ảnh của riêng mình

Để tìm hiểu cách thực hiện làm mịn và làm mờ với OpenCV, chỉ cần tiếp tục đọc

Tìm kiếm mã nguồn cho bài viết này?

Jump Right To The Downloads Section

Làm mịn và làm mờ OpenCV

Tôi khá chắc rằng tất cả chúng ta đều biết mờ là gì. Trực quan, đó là điều xảy ra khi máy ảnh của bạn chụp ảnh mất nét. Các vùng sắc nét hơn trong ảnh bị mất chi tiết. Mục tiêu ở đây là sử dụng bộ lọc thông thấp để giảm lượng nhiễu và chi tiết trong ảnh

Trên thực tế, điều này có nghĩa là mỗi pixel trong ảnh được trộn lẫn với cường độ pixel xung quanh nó. “Hỗn hợp” pixel này trong một vùng lân cận trở thành pixel bị mờ của chúng tôi

Mặc dù hiệu ứng này thường không mong muốn trong các bức ảnh của chúng tôi, nhưng nó thực sự khá hữu ích khi thực hiện các tác vụ xử lý ảnh. Trên thực tế, làm mịn và làm mờ là một trong những bước tiền xử lý phổ biến nhất trong xử lý hình ảnh và thị giác máy tính.

Ví dụ: chúng ta có thể thấy rằng làm mờ được áp dụng khi xây dựng một trình quét tài liệu đơn giản trên blog PyImageSearch. Chúng tôi cũng áp dụng tính năng làm mịn để hỗ trợ chúng tôi tìm điểm đánh dấu khi đo khoảng cách từ một đối tượng đến máy ảnh của chúng tôi. Trong cả hai ví dụ này, các chi tiết nhỏ hơn trong ảnh đều được làm mịn và chúng ta có nhiều khía cạnh cấu trúc hơn của ảnh

Như chúng ta sẽ thấy qua loạt bài hướng dẫn này, nhiều chức năng xử lý hình ảnh và thị giác máy tính, chẳng hạn như tạo ngưỡng và phát hiện cạnh, hoạt động tốt hơn nếu hình ảnh được làm mịn hoặc làm mờ lần đầu tiên

Tại sao làm mịn và làm mờ lại là một hoạt động tiền xử lý quan trọng như vậy?

Làm mịn và làm mờ là một trong những bước tiền xử lý quan trọng nhất trong tất cả các xử lý hình ảnh và thị giác máy tính. Bằng cách làm mịn hình ảnh trước khi áp dụng các kỹ thuật như phát hiện cạnh hoặc tạo ngưỡng, chúng tôi có thể giảm lượng nội dung tần số cao, chẳng hạn như nhiễu và các cạnh [i. e. , "chi tiết" của một hình ảnh]

Mặc dù điều này nghe có vẻ phản trực giác, nhưng bằng cách giảm chi tiết trong ảnh, chúng ta có thể dễ dàng tìm thấy các đối tượng mà chúng ta quan tâm hơn

Hơn nữa, điều này cho phép chúng tôi tập trung vào các đối tượng cấu trúc lớn hơn trong hình ảnh

Trong phần còn lại của bài học này, chúng ta sẽ thảo luận về bốn tùy chọn làm mịn và làm mờ chính mà bạn sẽ thường sử dụng trong các dự án của mình

  • Làm mờ trung bình đơn giản
  • Làm mờ Gaussian
  • lọc trung bình
  • lọc song phương

Bắt đầu nào

Định cấu hình môi trường phát triển của bạn

Để làm theo hướng dẫn này, bạn cần cài đặt thư viện OpenCV trên hệ thống của mình

May mắn thay, OpenCV có thể cài đặt bằng pip

$ pip install opencv-contrib-python

Nếu bạn cần trợ giúp để định cấu hình môi trường phát triển của mình cho OpenCV, tôi thực sự khuyên bạn nên đọc hướng dẫn cài đặt OpenCV theo pip của tôi — nó sẽ giúp bạn thiết lập và chạy trong vài phút

Bạn gặp sự cố khi định cấu hình môi trường phát triển của mình?

Hình 1. Gặp sự cố khi định cấu hình môi trường nhà phát triển của bạn?

Tất cả những gì đã nói, là bạn

  • Thời gian ngắn?
  • Tìm hiểu trên hệ thống bị khóa quản trị của chủ nhân của bạn?
  • Bạn muốn bỏ qua những rắc rối khi chiến đấu với dòng lệnh, trình quản lý gói và môi trường ảo?
  • Bạn đã sẵn sàng chạy mã ngay bây giờ trên các hệ thống Windows, macOS hoặc Linux của mình chưa?

Sau đó tham gia Đại học PyImageSearch ngay hôm nay

Có quyền truy cập Jupyter Notebooks cho hướng dẫn này và các hướng dẫn khác của PyImageSearch được định cấu hình sẵn để chạy trên hệ sinh thái của Google Colab ngay trong trình duyệt web của bạn. Không cần cài đặt

Và trên hết, những Notebook Jupyter này sẽ chạy trên Windows, macOS và Linux

Cấu trúc dự án

Trước khi chúng ta có thể tìm hiểu cách áp dụng tính năng làm mờ với OpenCV, trước tiên hãy xem lại cấu trúc thư mục dự án của chúng ta

Bắt đầu bằng cách truy cập phần “Tải xuống” của hướng dẫn này để truy xuất mã nguồn và hình ảnh ví dụ

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files

Tập lệnh đầu tiên của chúng tôi,

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
4, sẽ chỉ cho bạn cách áp dụng độ mờ trung bình, độ mờ Gaussian và độ mờ trung bình cho một hình ảnh [
$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
5] bằng OpenCV

Tập lệnh Python thứ hai,

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
6, sẽ trình bày cách sử dụng OpenCV để áp dụng hiệu ứng mờ hai bên cho hình ảnh đầu vào của chúng ta

Làm mờ trung bình [ cv2. mơ hồ ]

Phương pháp làm mờ đầu tiên chúng ta sẽ khám phá là tính trung bình

Bộ lọc trung bình thực hiện chính xác những gì bạn nghĩ nó có thể làm — lấy một vùng pixel bao quanh pixel trung tâm, tính trung bình cộng tất cả các pixel này lại với nhau và thay thế pixel trung tâm bằng pixel trung bình

Bằng cách lấy giá trị trung bình của khu vực xung quanh một pixel, chúng tôi sẽ làm mịn nó và thay thế nó bằng giá trị của vùng lân cận cục bộ của nó. Điều này cho phép chúng tôi giảm nhiễu và mức độ chi tiết, đơn giản bằng cách dựa vào mức trung bình

Bạn có nhớ khi chúng ta thảo luận về kernel và convolution không?

Để đạt được độ mờ trung bình, chúng tôi thực sự sẽ kết hợp hình ảnh của mình với một

bộ lọc chuẩn hóa trong đó cả
are both odd integers.

Hạt nhân này sẽ trượt từ trái sang phải và từ trên xuống dưới cho từng pixel trong hình ảnh đầu vào của chúng ta. Pixel ở trung tâm của kernel [và do đó tại sao chúng ta phải sử dụng một số lẻ, nếu không sẽ không có "trung tâm" thực sự] sau đó được đặt thành trung bình của tất cả các pixel khác xung quanh nó

Hãy tiếp tục và xác định một

nhân trung bình có thể được sử dụng để làm mờ pixel trung tâm với bán kính 3 pixel.

Lưu ý cách mỗi mục nhập của ma trận hạt nhân được tính trọng số đồng đều - chúng tôi đang tính trọng số bằng nhau cho tất cả các pixel trong hạt nhân. Một cách khác là cung cấp cho các pixel các trọng số khác nhau, trong đó các pixel ở xa pixel trung tâm đóng góp ít hơn vào mức trung bình;

Chúng ta cũng có thể định nghĩa một

nhân trung bình.

Nhân này chiếm nhiều pixel hơn so với mức trung bình và sẽ làm mờ hình ảnh nhiều hơn

kernel vì nhân bao phủ nhiều diện tích hơn của hình ảnh.

Do đó, điều này đưa chúng ta đến một quy tắc quan trọng. khi kích thước của hạt nhân tăng lên, mức độ mờ của hình ảnh cũng tăng theo

Chỉ cần đặt. nhân làm mịn của bạn càng lớn thì hình ảnh của bạn trông càng mờ

Để điều tra khái niệm này, hãy khám phá một số mã. Mở tệp

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
4 trong cấu trúc thư mục dự án của bạn và bắt đầu làm việc

# import the necessary packages
import argparse
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser[]
ap.add_argument["-i", "--image", type=str, default="adrian.png",
	help="path to input image"]
args = vars[ap.parse_args[]]

Dòng 2 và 3 nhập các gói cần thiết của chúng tôi trong khi Dòng 6-9 phân tích các đối số dòng lệnh của chúng tôi

Chúng tôi chỉ cần một đối số duy nhất,

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
8, là đường dẫn đến hình ảnh đầu vào của chúng tôi trên đĩa mà chúng tôi muốn áp dụng làm mịn và làm mờ cho. Theo mặc định, chúng tôi đặt đối số này thành
$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
5

Bây giờ hãy tải hình ảnh đầu vào của chúng tôi từ đĩa

# load the image, display it to our screen, and initialize a list of
# kernel sizes [so we can evaluate the relationship between kernel
# size and amount of blurring]
image = cv2.imread[args["image"]]
cv2.imshow["Original", image]
kernelSizes = [[3, 3], [9, 9], [15, 15]]

# loop over the kernel sizes
for [kX, kY] in kernelSizes:
	# apply an "average" blur to the image using the current kernel
	# size
	blurred = cv2.blur[image, [kX, kY]]
	cv2.imshow["Average [{}, {}]".format[kX, kY], blurred]
	cv2.waitKey[0]

Dòng 14 và 15 tải đầu vào của chúng tôi

# import the necessary packages
import argparse
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser[]
ap.add_argument["-i", "--image", type=str, default="adrian.png",
	help="path to input image"]
args = vars[ap.parse_args[]]
0 từ đĩa và hiển thị nó trên màn hình của chúng tôi

Sau đó, chúng tôi xác định danh sách

# import the necessary packages
import argparse
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser[]
ap.add_argument["-i", "--image", type=str, default="adrian.png",
	help="path to input image"]
args = vars[ap.parse_args[]]
1 trên Dòng 16 — kích thước của các hạt nhân này tăng dần để chúng tôi có thể hình dung tác động của kích thước hạt nhân đối với hình ảnh đầu ra

Từ đó, chúng tôi bắt đầu lặp lại từng kích thước hạt nhân trên Dòng 19

Để làm mờ trung bình một hình ảnh, chúng tôi sử dụng chức năng

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
0. Hàm này yêu cầu hai đối số. hình ảnh chúng tôi muốn làm mờ và kích thước của kernel

Như Dòng 22-24 hiển thị, chúng tôi làm mờ hình ảnh của mình bằng cách tăng kích thước hạt nhân. Hạt nhân của chúng ta càng lớn, hình ảnh của chúng ta sẽ càng mờ

Khi chạy tập lệnh này, bạn sẽ nhận được kết quả sau khi áp dụng hàm

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
0

Hình 2. Làm mịn hình ảnh bằng độ mờ trung bình. Lưu ý khi kích thước hạt nhân tăng lên, hình ảnh ngày càng mờ hơn

Ở phía trên bên trái, chúng ta có hình ảnh đầu vào ban đầu. Ở trên cùng bên phải, chúng tôi đã làm mờ nó bằng

kernel. Hình ảnh chỉ mờ hơn một chút vào thời điểm này và khu vực mờ đáng chú ý duy nhất là xung quanh vùng mặt. Tuy nhiên, khi chúng tôi đạt đến kích thước hạt nhân là
, hình ảnh thực tế không thể nhận dạng được.

Một lần nữa, khi kích thước hạt nhân của bạn tăng lên, hình ảnh của bạn sẽ ngày càng mờ hơn. Điều này có thể dễ dàng dẫn đến việc bạn bị mất các cạnh của các đối tượng cấu trúc quan trọng trong ảnh. Chọn mức độ làm mịn phù hợp là rất quan trọng khi phát triển các ứng dụng thị giác máy tính của riêng bạn

Mặc dù làm mịn trung bình khá đơn giản để hiểu, nhưng nó cũng đánh trọng số từng pixel bên trong vùng nhân như nhau — và bằng cách này, hình ảnh của chúng ta sẽ dễ bị mờ quá mức và bỏ sót các cạnh quan trọng. Chúng ta có thể khắc phục vấn đề này bằng cách áp dụng làm mờ Gaussian

Làm mờ Gaussian [ cv2. GaussianBlur]

Tiếp theo, chúng ta sẽ xem xét làm mờ Gaussian. Làm mờ Gaussian tương tự như làm mờ trung bình, nhưng thay vì sử dụng giá trị trung bình đơn giản, chúng tôi hiện đang sử dụng giá trị trung bình có trọng số, trong đó các pixel lân cận gần pixel trung tâm hơn sẽ đóng góp nhiều "trọng lượng" hơn cho mức trung bình

Và như tên cho thấy, làm mịn Gaussian được sử dụng để loại bỏ nhiễu xấp xỉ theo phân phối Gaussian

Kết quả cuối cùng là hình ảnh của chúng ta ít bị mờ hơn, nhưng “mờ tự nhiên” hơn so với sử dụng phương pháp trung bình đã thảo luận trong phần trước. Hơn nữa, dựa trên trọng số này, chúng tôi sẽ có thể giữ được nhiều cạnh hơn trong hình ảnh của mình so với làm mịn trung bình

Giống như làm mờ trung bình, làm mịn Gaussian cũng sử dụng nhân

, trong đó cả
đều .

Tuy nhiên, vì chúng tôi đang tính trọng số cho các pixel dựa trên khoảng cách của chúng với pixel trung tâm, nên chúng tôi cần một phương trình để xây dựng nhân của chúng tôi. Phương trình của hàm Gaussian theo một hướng là

Và sau đó, việc mở rộng phương trình này theo hai hướng, một cho trục x và một cho trục y, tương ứng trở nên đơn giản

trong đó

là khoảng cách tương ứng đến tâm ngang và dọc của nhân và
là .

Một lần nữa, như chúng ta sẽ thấy trong đoạn mã bên dưới, khi kích thước hạt nhân của chúng ta tăng lên thì mức độ mờ được áp dụng cho hình ảnh đầu ra của chúng ta cũng tăng theo. Tuy nhiên, hiệu ứng làm mờ sẽ có vẻ “tự nhiên” hơn và sẽ bảo vệ các cạnh trong ảnh của chúng ta tốt hơn so với làm mịn trung bình đơn giản

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
4

Dòng 27 và 28 chỉ cần đóng tất cả các cửa sổ đang mở và hiển thị hình ảnh ban đầu của chúng tôi làm điểm tham chiếu

Làm mờ Gaussian thực tế diễn ra trên Dòng 31-35 bằng cách sử dụng hàm

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
1. Đối số đầu tiên của hàm là hình ảnh chúng ta muốn làm mờ. Sau đó, tương tự như
$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
0, chúng tôi cung cấp một bộ đại diện cho kích thước hạt nhân của chúng tôi. Một lần nữa, chúng tôi bắt đầu với kích thước nhân nhỏ là
và bắt đầu tăng nó lên.

Tham số cuối cùng là

của chúng tôi, độ lệch chuẩn của phân phối Gaussian. Bằng cách đặt giá trị này thành
# import the necessary packages
import argparse
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser[]
ap.add_argument["-i", "--image", type=str, default="adrian.png",
	help="path to input image"]
args = vars[ap.parse_args[]]
6, chúng tôi đang hướng dẫn OpenCV tự động tính toán
dựa trên kích thước hạt nhân của chúng tôi.

Trong hầu hết các trường hợp, bạn sẽ muốn

được tính toán cho mình. Nhưng trong trường hợp bạn muốn cung cấp
cho chính mình, tôi khuyên bạn nên đọc qua tài liệu OpenCV trên
$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
1 để đảm bảo bạn hiểu ý nghĩa.

Chúng ta có thể thấy đầu ra của Gaussian blur trong Hình 3

Hình 3. Áp dụng làm mờ Gaussian

Hình ảnh của chúng tôi có ít hiệu ứng mờ hơn so với khi sử dụng phương pháp lấy trung bình trong Hình 2;

Nói chung, tôi có xu hướng khuyên bạn nên bắt đầu với hiệu ứng làm mờ Gaussian đơn giản và điều chỉnh các tham số của bạn khi cần. Mặc dù độ mờ Gaussian chậm hơn một chút so với độ mờ trung bình đơn giản [và chỉ bằng một phần rất nhỏ], độ mờ Gaussian có xu hướng cho kết quả đẹp hơn nhiều, đặc biệt là khi áp dụng cho hình ảnh tự nhiên

Làm mờ trung tuyến [ cv2. medianBlur ]

Theo truyền thống, phương pháp làm mờ dải phân cách có hiệu quả nhất khi loại bỏ nhiễu muối tiêu. Loại tiếng ồn này chính xác là âm thanh của nó. hãy tưởng tượng chụp một bức ảnh, đặt nó trên bàn ăn của bạn và rắc muối và hạt tiêu lên trên nó. Sử dụng phương pháp làm mờ trung bình, bạn có thể loại bỏ muối và hạt tiêu khỏi hình ảnh của mình

Khi áp dụng độ mờ trung bình, trước tiên chúng tôi xác định kích thước hạt nhân của mình. Sau đó, như trong phương pháp làm mờ trung bình, chúng tôi xem xét tất cả các pixel trong vùng lân cận có kích thước

trong đó
là một số nguyên lẻ.

Lưu ý, không giống như làm mờ trung bình và làm mờ Gaussian trong đó kích thước hạt nhân có thể là hình chữ nhật, kích thước hạt nhân cho trung vị phải là hình vuông. Hơn nữa [không giống như phương pháp lấy trung bình], thay vì thay thế pixel trung tâm bằng giá trị trung bình của vùng lân cận, chúng tôi thay thế pixel trung tâm bằng trung vị của vùng lân cận

Lý do làm mờ trung bình hiệu quả hơn trong việc loại bỏ nhiễu kiểu muối tiêu khỏi hình ảnh là vì mỗi pixel trung tâm luôn được thay thế bằng cường độ pixel tồn tại trong hình ảnh. Và vì giá trị trung bình mạnh đối với các giá trị ngoại lệ, nên nhiễu muối tiêu sẽ ít ảnh hưởng đến giá trị trung bình hơn so với một phương pháp thống kê khác, chẳng hạn như giá trị trung bình

Một lần nữa, các phương pháp như phương tiện tính toán trung bình và Gaussian hoặc phương tiện có trọng số cho vùng lân cận - cường độ pixel trung bình này có thể có hoặc không có trong vùng lân cận. Nhưng theo định nghĩa, pixel trung vị phải tồn tại trong vùng lân cận của chúng ta. Bằng cách thay thế pixel trung tâm bằng trung vị thay vì trung bình, chúng tôi có thể giảm nhiễu đáng kể

Bây giờ hãy áp dụng độ mờ trung bình của chúng ta

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
9

Việc áp dụng độ mờ trung bình được thực hiện bằng cách gọi hàm

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
2. Phương thức này nhận hai tham số. hình ảnh chúng tôi muốn làm mờ và kích thước của hạt nhân của chúng tôi

Trên Dòng 42, chúng tôi bắt đầu lặp lại các kích thước hạt nhân [hình vuông]. Chúng tôi bắt đầu với kích thước hạt nhân là

# import the necessary packages
import argparse
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser[]
ap.add_argument["-i", "--image", type=str, default="adrian.png",
	help="path to input image"]
args = vars[ap.parse_args[]]
9 và sau đó tăng lên thành
# load the image, display it to our screen, and initialize a list of
# kernel sizes [so we can evaluate the relationship between kernel
# size and amount of blurring]
image = cv2.imread[args["image"]]
cv2.imshow["Original", image]
kernelSizes = [[3, 3], [9, 9], [15, 15]]

# loop over the kernel sizes
for [kX, kY] in kernelSizes:
	# apply an "average" blur to the image using the current kernel
	# size
	blurred = cv2.blur[image, [kX, kY]]
	cv2.imshow["Average [{}, {}]".format[kX, kY], blurred]
	cv2.waitKey[0]
0 và
# load the image, display it to our screen, and initialize a list of
# kernel sizes [so we can evaluate the relationship between kernel
# size and amount of blurring]
image = cv2.imread[args["image"]]
cv2.imshow["Original", image]
kernelSizes = [[3, 3], [9, 9], [15, 15]]

# loop over the kernel sizes
for [kX, kY] in kernelSizes:
	# apply an "average" blur to the image using the current kernel
	# size
	blurred = cv2.blur[image, [kX, kY]]
	cv2.imshow["Average [{}, {}]".format[kX, kY], blurred]
	cv2.waitKey[0]
1

Các hình ảnh mờ trung bình thu được sau đó được xếp chồng lên nhau và hiển thị cho chúng ta xem trong Hình 4

hinh 4. Áp dụng độ mờ trung bình với kích thước hạt nhân lớn hơn dần dần

Lưu ý rằng chúng tôi không còn tạo hiệu ứng “làm mờ chuyển động” như trong tính năng làm mờ Gaussian và trung bình — thay vào đó, chúng tôi đang loại bỏ nhiều chi tiết và nhiễu hơn đáng kể

Ví dụ: hãy xem màu sắc của những tảng đá ở bên phải tôi trong ảnh. Khi kích thước hạt nhân của chúng tôi tăng lên, chi tiết và màu sắc trên đá trở nên ít rõ rệt hơn. Vào thời điểm chúng tôi đang sử dụng

kernel, các tảng đá đã mất gần như toàn bộ chi tiết và trông giống như một “đốm màu” lớn. ”

Điều tương tự cũng xảy ra đối với khuôn mặt của tôi trong ảnh — khi kích thước hạt nhân tăng lên, khuôn mặt của tôi nhanh chóng mất đi chi tiết và gần như hòa trộn với nhau

Độ mờ trung bình hoàn toàn không phải là “độ mờ tự nhiên” như làm mịn Gaussian. Tuy nhiên, đối với ảnh bị hỏng hoặc ảnh được chụp trong điều kiện dưới mức tối ưu, độ mờ trung bình thực sự có thể hữu ích như một bước tiền xử lý trước khi chuyển ảnh theo các phương pháp khác, chẳng hạn như tạo ngưỡng và phát hiện cạnh

Làm mờ hai bên [ cv2. bộ lọc song phương]

Phương pháp cuối cùng chúng ta sẽ khám phá là làm mờ song phương

Cho đến nay, mục đích của các phương pháp làm mờ của chúng tôi là giảm nhiễu và chi tiết trong ảnh;

Để giảm nhiễu trong khi vẫn duy trì các cạnh, chúng ta có thể sử dụng làm mờ song phương. Làm mờ song phương thực hiện điều này bằng cách giới thiệu hai bản phân phối Gaussian

Hàm Gaussian đầu tiên chỉ xem xét các lân cận không gian. Nghĩa là, các pixel xuất hiện gần nhau trong không gian tọa độ

của hình ảnh. Gaussian thứ hai sau đó lập mô hình cường độ pixel của vùng lân cận, đảm bảo rằng chỉ những pixel có cường độ tương tự mới được đưa vào tính toán thực tế của độ mờ.

Theo trực giác, điều này có ý nghĩa. Nếu các pixel trong cùng một vùng lân cận [nhỏ] có giá trị pixel giống nhau, thì chúng có thể đại diện cho cùng một đối tượng. Nhưng nếu hai pixel trong cùng một vùng lân cận có các giá trị tương phản, thì chúng tôi có thể kiểm tra cạnh hoặc ranh giới của một đối tượng — và chúng tôi muốn giữ lại cạnh này

Nhìn chung, phương pháp này có thể bảo toàn các cạnh của hình ảnh, trong khi vẫn giảm nhiễu. Nhược điểm lớn nhất của phương pháp này là nó chậm hơn đáng kể so với các phương pháp làm mờ trung bình, Gaussian và trung vị của nó

Hãy đi sâu vào mã để làm mờ song phương. Mở tệp

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
6 trong cấu trúc thư mục dự án của bạn và chúng tôi sẽ bắt đầu làm việc

# import the necessary packages
import argparse
import cv2

# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser[]
ap.add_argument["-i", "--image", type=str, default="adrian.png",
	help="path to input image"]
args = vars[ap.parse_args[]]

Dòng 2 và 3 nhập các gói Python cần thiết của chúng tôi trong khi Dòng 6-9 phân tích đối số dòng lệnh của chúng tôi

Một lần nữa, chỉ cần một đối số duy nhất,

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
8, là đường dẫn đến hình ảnh đầu vào mà chúng tôi muốn áp dụng làm mờ song phương cho

Bây giờ hãy tải hình ảnh của chúng tôi từ đĩa

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
7

Sau đó, chúng tôi xác định danh sách các tham số làm mờ trên Dòng 15. Các tham số này tương ứng với đường kính,

của bộ lọc song phương, tương ứng.

Từ đó, chúng tôi lặp lại từng bộ tham số này trên Dòng 18 và áp dụng tính năng lọc song phương bằng cách thực hiện cuộc gọi tới

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
3 trên Dòng 21

Cuối cùng, Dòng 24-27 hiển thị hình ảnh mờ của chúng tôi trên màn hình của chúng tôi

Hãy dành một chút thời gian và xem xét các thông số mà chúng tôi cung cấp cho

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
3. Tham số đầu tiên chúng tôi cung cấp là hình ảnh chúng tôi muốn làm mờ. Sau đó, chúng ta cần xác định đường kính của vùng lân cận pixel — đường kính này càng lớn thì càng có nhiều pixel được đưa vào tính toán làm mờ. Hãy nghĩ về tham số này như một kích thước hạt nhân hình vuông

Đối số thứ ba là độ lệch chuẩn màu của chúng tôi, được ký hiệu là

. Giá trị lớn hơn cho
có nghĩa là nhiều màu hơn trong vùng lân cận sẽ được xem xét khi tính toán độ mờ. Nếu chúng ta để
quá lớn so với đường kính, thì về cơ bản, chúng ta đã phá vỡ giả định về lọc song phương — rằng chỉ các pixel có màu tương tự mới góp phần đáng kể vào việc làm mờ.

Cuối cùng, chúng ta cần cung cấp độ lệch chuẩn không gian mà chúng ta gọi là

. Giá trị
lớn hơn có nghĩa là các pixel ở xa đường kính pixel trung tâm hơn sẽ ảnh hưởng đến phép tính làm mờ.

Khi bạn thực thi tập lệnh này, bạn sẽ thấy đầu ra sau từ lọc song phương

Hình 5. Áp dụng lọc song phương cho hình ảnh của chúng tôi

Ở phía trên bên trái, chúng ta có hình ảnh đầu vào ban đầu. Và ở trên cùng bên phải, chúng tôi bắt đầu với đường kính

pixel,
.

Hiệu ứng làm mờ của chúng tôi vẫn chưa hoàn toàn rõ ràng, nhưng nếu bạn phóng to các tảng đá và so sánh chúng với hình ảnh ban đầu của chúng tôi, bạn sẽ nhận thấy rằng phần lớn kết cấu đã biến mất. Những tảng đá trông nhẵn nhụi hơn nhiều, như thể chúng đã bị bào mòn và nhẵn nhụi qua nhiều năm dòng nước chảy xiết. Tuy nhiên, các cạnh và ranh giới giữa hồ và đá được duy trì rõ ràng

Bây giờ, hãy nhìn vào phía dưới bên trái nơi chúng tôi đã tăng cả

cùng nhau. Tại thời điểm này, chúng ta thực sự có thể thấy tác dụng của lọc song phương.

Các nút trên áo hoodie đen của tôi thực tế đã biến mất và gần như tất cả các chi tiết và nếp nhăn trên da của tôi đã được loại bỏ. Tuy nhiên, đồng thời vẫn có một ranh giới rõ ràng giữa tôi và nền của bức ảnh. Nếu chúng ta đang sử dụng độ mờ trung bình hoặc Gaussian, hậu cảnh sẽ hòa trộn với tiền cảnh

Cuối cùng, chúng ta có góc dưới bên phải, nơi tôi đã tăng

một lần nữa, chỉ để chứng minh sức mạnh của kỹ thuật lọc song phương .

Bây giờ gần như tất cả các chi tiết và kết cấu từ đá, nước, bầu trời, da và áo hoodie của tôi đều biến mất. Nó cũng bắt đầu trông như thể số lượng màu trong hình ảnh đã bị giảm đi

Một lần nữa, đây là một ví dụ phóng đại và bạn có thể sẽ không áp dụng nhiều hiệu ứng làm mờ này cho hình ảnh, nhưng nó chứng tỏ hiệu ứng lọc song phương sẽ có trên các cạnh của bạn. chi tiết và kết cấu được làm mịn đáng kể, trong khi vẫn giữ được các đường viền và cạnh

Vậy là bạn đã có nó — tổng quan về các kỹ thuật làm mờ. Nếu vẫn chưa hoàn toàn rõ ràng khi nào bạn sẽ sử dụng từng phương pháp làm mờ hoặc làm mịn, thì không sao. Chúng ta sẽ xây dựng cơ bản dựa trên các kỹ thuật làm mờ này trong loạt bài hướng dẫn này và bạn sẽ thấy rất nhiều ví dụ về thời điểm áp dụng từng loại làm mờ. Hiện tại, chỉ cần cố gắng tiêu hóa tài liệu và lưu trữ làm mờ và làm mịn như một công cụ khác trong bộ công cụ của bạn

Kết quả làm mờ OpenCV

Bạn đã sẵn sàng chạy các tập lệnh làm mịn và làm mờ của chúng tôi chưa?

Đảm bảo truy cập phần “Tải xuống” của hướng dẫn này để truy xuất mã nguồn và hình ảnh ví dụ

Sau đó, bạn có thể áp dụng làm mịn và làm mờ cơ bản bằng cách thực thi tập lệnh

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
4

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
1

Để xem kết quả làm mờ song phương, hãy chạy lệnh sau

$ tree . --dirsfirst
.
├── adrian.png
├── bilateral.py
└── blurring.py

0 directories, 3 files
2

Đầu ra của các tập lệnh này phải khớp với hình ảnh và số liệu tôi đã cung cấp ở trên

Cái gì tiếp theo?

Thông tin khóa học.
Tổng cộng hơn 60 lớp • Hơn 64 giờ video hướng dẫn mã theo yêu cầu • Cập nhật lần cuối. Tháng 12 năm 2022
★★★★★ 4. 84 [128 Xếp hạng] • Hơn 15.800 Học sinh Ghi danh

Tôi thực sự tin rằng nếu bạn có đúng giáo viên, bạn có thể thành thạo thị giác máy tính và học sâu

Bạn có nghĩ rằng việc học thị giác máy tính và học sâu tốn nhiều thời gian, quá sức và phức tạp không?

Đó không phải là trường hợp

Tất cả những gì bạn cần để thành thạo thị giác máy tính và học sâu là nhờ ai đó giải thích mọi thứ cho bạn bằng các thuật ngữ đơn giản, trực quan. Và đó chính xác là những gì tôi làm. Nhiệm vụ của tôi là thay đổi giáo dục và cách dạy các chủ đề Trí tuệ nhân tạo phức tạp

Nếu bạn nghiêm túc về việc học thị giác máy tính, điểm dừng chân tiếp theo của bạn phải là Đại học PyImageSearch, khóa học trực tuyến về thị giác máy tính, học sâu và OpenCV toàn diện nhất hiện nay. Tại đây, bạn sẽ học cách áp dụng thành công và tự tin tầm nhìn máy tính vào công việc, nghiên cứu và dự án của mình. Tham gia cùng tôi trong việc làm chủ thị giác máy tính

Bên trong Đại học PyImageSearch, bạn sẽ tìm thấy

  • ✓ Hơn 60 khóa học về chủ đề thị giác máy tính thiết yếu, học sâu và OpenCV
  • ✓ Hơn 60 Chứng chỉ Hoàn thành
  • ✓ Hơn 64 giờ video theo yêu cầu
  • ✓ Các khóa học hoàn toàn mới được phát hành thường xuyên, đảm bảo bạn có thể theo kịp các kỹ thuật tiên tiến nhất
  • ✓ Máy tính xách tay Jupyter được định cấu hình sẵn trong Google Colab
  • ✓ Chạy tất cả các mẫu mã trong trình duyệt web của bạn — hoạt động trên Windows, macOS và Linux [không yêu cầu cấu hình môi trường nhà phát triển. ]
  • ✓ Truy cập kho lưu trữ mã tập trung cho tất cả hơn 500 hướng dẫn trên PyImageSearch
  • ✓ Dễ dàng tải xuống bằng một cú nhấp chuột đối với mã, bộ dữ liệu, mô hình được đào tạo trước, v.v.
  • ✓ Truy cập trên thiết bị di động, máy tính xách tay, máy tính để bàn, v.v.

Nhấn vào đây để tham gia Đại học PyImageSearch

Tóm lược

Trong hướng dẫn này, chúng ta đã học cách làm mịn và mờ hình ảnh bằng OpenCV. Chúng tôi bắt đầu bằng cách thảo luận về vai trò của hạt nhân trong việc làm mịn và làm mờ

Sau đó, chúng tôi đã xem xét bốn phương pháp chính để làm mịn hình ảnh trong OpenCV

  1. Làm mờ trung bình đơn giản
  2. Làm mờ Gaussian
  3. lọc trung bình
  4. lọc song phương

Phương pháp trung bình đơn giản nhanh, nhưng có thể không bảo toàn các cạnh trong ảnh

Áp dụng hiệu ứng làm mờ Gaussian tốt hơn trong việc bảo toàn các cạnh, nhưng chậm hơn một chút so với phương pháp trung bình

Bộ lọc trung vị chủ yếu được sử dụng để giảm nhiễu kiểu muối tiêu vì thống kê trung vị mạnh hơn nhiều và ít nhạy cảm hơn với các ngoại lệ so với các phương pháp thống kê khác như giá trị trung bình

Cuối cùng, bộ lọc song phương bảo toàn các cạnh, nhưng chậm hơn đáng kể so với các phương pháp khác. Lọc song phương cũng tự hào có hầu hết các tham số để điều chỉnh, điều này có thể gây phiền toái để điều chỉnh chính xác

Nói chung, tôi khuyên bạn nên bắt đầu với hiệu ứng làm mờ Gaussian đơn giản để có được đường cơ sở và sau đó bắt đầu từ đó

Để tải mã nguồn về bài đăng này [và được thông báo khi các hướng dẫn trong tương lai được xuất bản tại đây trên PyImageSearch], chỉ cần nhập địa chỉ email của bạn vào biểu mẫu bên dưới

Cái gì tiếp theo?

Thông tin khóa học.
Tổng cộng hơn 60 lớp • Hơn 64 giờ video hướng dẫn mã theo yêu cầu • Cập nhật lần cuối. Tháng 12 năm 2022
★★★★★ 4. 84 [128 Xếp hạng] • Hơn 15.800 Học sinh Ghi danh

Tôi thực sự tin rằng nếu bạn có đúng giáo viên, bạn có thể thành thạo thị giác máy tính và học sâu

Bạn có nghĩ rằng việc học thị giác máy tính và học sâu tốn nhiều thời gian, quá sức và phức tạp không?

Đó không phải là trường hợp

Tất cả những gì bạn cần để thành thạo thị giác máy tính và học sâu là nhờ ai đó giải thích mọi thứ cho bạn bằng các thuật ngữ đơn giản, trực quan. Và đó chính xác là những gì tôi làm. Nhiệm vụ của tôi là thay đổi giáo dục và cách dạy các chủ đề Trí tuệ nhân tạo phức tạp

Nếu bạn nghiêm túc về việc học thị giác máy tính, điểm dừng chân tiếp theo của bạn phải là Đại học PyImageSearch, khóa học trực tuyến về thị giác máy tính, học sâu và OpenCV toàn diện nhất hiện nay. Tại đây, bạn sẽ học cách áp dụng thành công và tự tin tầm nhìn máy tính vào công việc, nghiên cứu và dự án của mình. Tham gia cùng tôi trong việc làm chủ thị giác máy tính

Bên trong Đại học PyImageSearch, bạn sẽ tìm thấy

  • ✓ Hơn 60 khóa học về chủ đề thị giác máy tính thiết yếu, học sâu và OpenCV
  • ✓ Hơn 60 Chứng chỉ Hoàn thành
  • ✓ Hơn 64 giờ video theo yêu cầu
  • ✓ Các khóa học hoàn toàn mới được phát hành thường xuyên, đảm bảo bạn có thể theo kịp các kỹ thuật tiên tiến nhất
  • ✓ Máy tính xách tay Jupyter được định cấu hình sẵn trong Google Colab
  • ✓ Chạy tất cả các mẫu mã trong trình duyệt web của bạn — hoạt động trên Windows, macOS và Linux [không yêu cầu cấu hình môi trường nhà phát triển. ]
  • ✓ Truy cập kho lưu trữ mã tập trung cho tất cả hơn 500 hướng dẫn trên PyImageSearch
  • ✓ Dễ dàng tải xuống bằng một cú nhấp chuột đối với mã, bộ dữ liệu, mô hình được đào tạo trước, v.v.
  • ✓ Truy cập trên thiết bị di động, máy tính xách tay, máy tính để bàn, v.v.

Nhấn vào đây để tham gia Đại học PyImageSearch

Tải xuống Mã nguồn và Hướng dẫn tài nguyên 17 trang MIỄN PHÍ

Nhập địa chỉ email của bạn dưới đây để có được một. zip của mã và Hướng dẫn tài nguyên 17 trang MIỄN PHÍ về Thị giác máy tính, OpenCV và Học sâu. Bên trong, bạn sẽ tìm thấy các hướng dẫn, sách, khóa học và thư viện được chọn lọc thủ công của tôi để giúp bạn thành thạo CV và DL

Làm mờ Gaussian được thực hiện như thế nào?

TLDR. Hiệu ứng làm mờ Gaussian được áp dụng bằng cách xoắn hình ảnh bằng hàm Gaussian . Trong tiếng Anh, điều này có nghĩa là chúng ta sẽ sử dụng hàm Gaussian và chúng ta sẽ tạo ra một ma trận n x m. Sử dụng ma trận này và chiều cao của phân phối Gaussian tại vị trí pixel đó, chúng tôi sẽ tính toán các giá trị RGB mới cho hình ảnh bị mờ.

Gaussian blur OpenCV Python là gì?

Python - OpenCV & PyQT5 cùng nhau . Bộ lọc Gaussian là bộ lọc thông thấp loại bỏ các thành phần tần số cao được giảm. the image is convolved with a Gaussian filter instead of the box filter. The Gaussian filter is a low-pass filter that removes the high-frequency components are reduced.

Chủ Đề