Gaussian blur là gì

  -  
vhpi.vn chia sẻ mọi trang bị về game / ứng dụng / Thủ Thuật giành cho máy tính với mọi tin hay duy nhất và hồ hết thông tin kỹ năng hỏi đáp.

Lọc ảnh (làm mịn ảnh, có tác dụng mượt ảnh) là một bước rất quan trọng trong xử lý ảnh. Lọc ảnh thực tế bao gồm rất nhiều tác dụng như loại bỏ nhiễu, tra cứu biên đối tượng. Bài viết này sẽ giới thiệu nguyên tắc phổ biến của lọc ảnh và một vài phép lọc ảnh cơ bản.

Bạn đang xem: Gaussian blur là gì

Đang xem: Gaussian blur là gì

A. Hình thức chung của thanh lọc ảnh

Nguyên tắc phổ biến của các phương pháp lọc là mang đến ma trận ảnh nhân với 1 ma trận lọc (Kernel). Ma trận lọc lọc (Kernel) còn có thể được call là cửa số chập (trong phép nhân chập), hành lang cửa số lọc, mặt nạ,… Trong nội dung bài viết này tôi áp dụng thuật ngữ ma trận thanh lọc (Kernel).

Việc nhân ảnh với ma trận lọc y như việc trượt ma trận lọc theo mặt hàng trên ảnh và nhân cùng với từng vùng của ảnh, cùng các hiệu quả lại chế tạo thành tác dụng của điểm ảnh trung tâm.

Minh họa bài toán nhân ma trận ảnh. Hình hình ảnh được lấy từ https://github.com/vdumoulin/conv_arithmetic

Ma trận nguồn vào I được nhân với ma trận lọc (phần xám sống hình trái) để tạo thành thành ma trận cổng output O.

Trên thực tế, chúng ta sẽ thấy gồm 2 phép lọc ảnh là tương quan (correlation) và tích chập (convolution). Với phép tương quan, ma trận lọc đã đượt trượt đi với nhân cùng với từng vùng của hình ảnh như trên. Mặc dù với phép tích chập, ma trận lọc sẽ tiến hành xoay 180 độ (theo cả chiều ngang cùng dọc) trước khi thực hiện nhân. 2 phép toán này là tương tự khi ma trận lọc đối xứng.

Với mỗi phép lọc ta có những ma trận lọc (Kernel) khác nhau, không có một quy định cụ thể nào cho việc xác định M. Size ma trận M là một số lẻ. Ví dụ: 3×3, 5×5.

Khi nhân các phần tử tương ứng cùng nhau (giữa pixel, các điểm cạnh bên – các thành phía bên trong kernel), so với các bộ phận ở cạnh thì đã có một số trong những pixel bị khuyết, thời điểm này, có tương đối nhiều cách xử lý như quăng quật qua, chèn thêm một (một số) hàng, cột với giá trị 0 hoặc bởi giá trị gần nhất, hoặc tạo ra một đối xứng gương sống cạnh ảnh.

Tổng Tpt những phẩn tử trong ma trận M thường xuyên là 1.

Tpt > 1: Ảnh sau khi thực hiện ngừng phép lọc số ảnh (Idst) tất cả độ sáng to hơn so với ảnh ban đầu (Isrc).**Tpt dst) gồm độ sáng nhỏ dại hơn so với hình ảnh ban đầu (Isrc).

Ví dụ

$$M = eginbmatrix1/9 & 1/9 & 1/9 1/9 & 1/9 & 1/9 1/9 & 1/9 & 1/9 endbmatrix$$

B. Một số trong những bộ lọc làm mịn ảnh

1. Thanh lọc trung bình (Normalized Box Filter)

Đây là cỗ lọc đơn giản và dễ dàng nhất. Nó được kiến thiết dựa trên ý tưởng phát minh tính quý hiếm một điểm hình ảnh bằng trung bình cộng các điểm hình ảnh xung quanh nó.

Ma trận lọc của lọc trung bình tất cả dạng:

$$K = frac1K_width cdot K_heighteginbmatrix1 & 1 & 1 & ldots & 1 1 & 1 & 1 & ldots & 1 cdot & cdot & cdot & ldots & 1 1 & 1 & 1 & ldots & 1endbmatrix$$

Cách thanh lọc này hay được áp dụng cho làm cho trơn hình ảnh vẫn muốn giữ lại biên không xẩy ra mờ.

Code với Python – OpenCV: Đoạn code sau sẽ thực hiện lọc hình ảnh với ma trận lọc trung bình 5 x 5. Lưu ý: toàn cục mã nguồn với hình ảnh dùng trong bài viết có thể được sở hữu về tại link trong mục Tham khảo.

$$K = frac125 eginbmatrix 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 1 & 1 & 1 & 1 & 1 endbmatrix$$

1import cv2 as cv 2import numpy as np 3from matplotlib import pyplot as plt 4 5# Load and blur image 6img = cv.imread('rose_gauss.jpg') 7img2 = cv.imread('rose_salt_and_pepper.jpg') 8blur = cv.blur(img,(5,5)) 9blur2 = cv.blur(img2,(5,5))1011# Convert màu sắc from bgr (OpenCV default) khổng lồ rgb12img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)13blur_rgb = cv.cvtColor(blur, cv.COLOR_BGR2RGB)14img_rgb2 = cv.cvtColor(img2, cv.COLOR_BGR2RGB)15blur_rgb2 = cv.cvtColor(blur2, cv.COLOR_BGR2RGB)1617# Display18plt.subplot(221),plt.imshow(img_rgb),plt.title('Gauss Noise')19plt.xticks(), plt.yticks()20plt.subplot(222),plt.imshow(blur_rgb),plt.title('Gauss Noise – Blurred')21plt.xticks(), plt.yticks()22plt.subplot(223),plt.imshow(img_rgb2),plt.title('Salt&Pepper Noise')23plt.xticks(), plt.yticks()24plt.subplot(224),plt.imshow(blur_rgb2),plt.title('Salt&Pepper Noise – Blurred')25plt.xticks(), plt.yticks()26plt.show()Sau trên đây là kết quả sau khi chạy đoạn code trên:

Chú ý: bạn cần cài gói matplotlib (dùng pip) với tkinter để sử dụng với Python. Với Python 3.6, việc setup tkinter hoàn toàn có thể sử dụng:

Trên thực tế, cầm cố vì áp dụng hàm cv2.blur() thì cỗ lọc trung bình rất có thể được sử dụng với hàm: cv2.filter2D() với một thông số là ma trận lọc.

kernel = np.ones((5,5),np.float32)/25blur = cv.filter2D(img,-1,kernel)Khi nắm ma trận lọc trung bình bằng một ma trận khác, bạn có thể có phần đông phép lọc khác như lọc thông thấp (low-pass filters(LPF)) hoặc thanh lọc thông cao (high-pass filters(HPF) ).

2. Lọc Gauss (Gaussian Filter)

Bộ lọc Gauss được biết bộ lọc hữu dụng nhất, được thực hiện bằng phương pháp nhân chập hình ảnh đầu vào với cùng 1 ma trận thanh lọc Gauss tiếp nối cộng bọn chúng lại để sản xuất thành ảnh đầu ra.

Ý tưởng thông thường là giá trị mỗi điểm ảnh sẽ dựa vào nhiều vào những điểm hình ảnh ở ngay gần hơn là những điểm ảnh ở xa. Trọng số của sự dựa vào được rước theo hàm Gauss (cũng được áp dụng trong quy luật cung cấp chuẩn).

Dưới đấy là biểu diễn ma trận lọc Gauss:

Giả sử ảnh là một chiều. Điểm ảnh ở trung tâm sẽ có trọng số to nhất. Các điểm ảnh ở càng xa trung tâm sẽ có được trọng số bớt dần khi khoảng cách từ bọn chúng tới điểm nóng tăng lên. Bởi vậy điểm càng gần trung trung tâm sẽ càng đóng góp nhiều hơn nữa vào quý hiếm điểm trung tâm.

Chú ý: bên trên thực tế, việc lọc hình ảnh dựa bên trên hàm Gauss 2 chiều (ngang cùng dọc). Phân phối chuẩn chỉnh 2 chiều hoàn toàn có thể biểu diễn bên dưới dạng:

$$G_0(x, y) = A e^ dfrac -(x – mu_x)^2 2sigma^2_x + dfrac -(y – mu_y)^2 2sigma^2_y $$

Trong đó $mu $ là mức độ vừa phải (đỉnh), $sigma^2$ là phương sai của những biến số $x$ với $y$.

Tham số $mu$ quyết định công dụng của bộ lọc Gauss lên ảnh. Độ khủng của ma trận thanh lọc (kernel) cần được lựa chọn cho vừa khéo rộng.

Code thực tiễn lọc Gauss cùng với Python – OpenCV: vào OpenCV họ sử dụng hàm sau để lọc Gauss: cv.GaussianBlur().

Bạn cũng hoàn toàn có thể tạo một ma trận lọc Gauss và sử dụng với hàm cv.filter2D() phía trên bằng phương pháp sử dụng: cv.getGaussianKernel().

1import cv2 as cv 2import numpy as np 3from matplotlib import pyplot as plt 4 5# Load and blur image 6img = cv.imread('rose_gauss.jpg') 7img2 = cv.imread('rose_salt_and_pepper.jpg') 8blur = cv.GaussianBlur(img,(5,5),0) 9blur2 = cv.GaussianBlur(img2,(5,5),0)1011# Convert màu sắc from bgr (OpenCV default) lớn rgb12img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)13blur_rgb = cv.cvtColor(blur, cv.COLOR_BGR2RGB)14img_rgb2 = cv.cvtColor(img2, cv.COLOR_BGR2RGB)15blur_rgb2 = cv.cvtColor(blur2, cv.COLOR_BGR2RGB)1617# Display18plt.subplot(221),plt.imshow(img_rgb),plt.title('Gauss Noise')19plt.xticks(), plt.yticks()20plt.subplot(222),plt.imshow(blur_rgb),plt.title('Gauss Noise – Blurred')21plt.xticks(), plt.yticks()22plt.subplot(223),plt.imshow(img_rgb2),plt.title('Salt&Pepper Noise')23plt.xticks(), plt.yticks()24plt.subplot(224),plt.imshow(blur_rgb2),plt.title('Salt&Pepper Noise – Blurred')25plt.xticks(), plt.yticks()26plt.show()Dưới đây là hiệu quả lọc áp dụng phép lọc Gauss.

Xem thêm: Stop By Là Gì Và Cấu Trúc Cụm Từ Stop By Trong Câu Tiếng Anh

Các chúng ta cũng có thể thấy hiệu quả lọc (Gauss noise) tốt nhất mà hình hình ảnh không bị nhòe nhiều như phép lọc trung bình như trên.

3. Lọc trung vị

Phép lọc trung vị cũng rất được thực hiện với những ma trận lọc. Mặc dù nó tính trung vị tất cả các giá trị điểm ảnh trong vùng ma trận lọc và sử dụng trung vị này đến giá trị điểm trung tâm. Một điều khá thú vị là với những cách lọc ngơi nghỉ trên, quý hiếm điểm trung tâm được xem mới (có thể bởi hoặc khác với giá trị một điểm vào vùng ma trận lọc), còn với phép thanh lọc trung vị, quý giá điểm trung tâm luôn luôn được thay bởi một giá trị điểm ảnh trong bức ảnh đầu vào. Bởi vậy, phương thức lọc này có tác dụng loại bỏ nhiễu muối hạt tiêu (salt-and-pepper noise ) hơi tốt.

Có một điểm cũng cần được chăm chú là phép lọc trung bình cùng lọc Gauss là phép lọc con đường tính, nhưng phép lọc trung vị không phải là 1 trong phép lọc đường tính.

Để thực hiện lọc trung vị trong OpenCV, ta sử dụng hàm: cv.medianBlur().

Tương tự nhị ví dụ ở trên, ta thay cách lọc thành:

Kết quả triển khai lọc trung vị với một số trong những nhiễu:

Có thể thấy rõ, với bài toán lọc trung vị, nhiễu muối hạt tiêu đang được loại trừ tốt hơn nhiều so với lọc trung bình giỏi lọc Gauss.

4. Bộ lọc Bilateral (bộ lọc nhị chiều)

cv.bilateralFilter() là 1 bộ lọc hiệu quả cao trong việc loạt bỏ nhiễu nhưng mà vẫn giữ giàng được những đường viền (cạnh) trong ảnh.

Như họ đã biết, cỗ lọc Gauss đưa ra quyết định giá trị một điểm ảnh bằng cách lấy vừa phải theo hàm Gauss các giá trị điểm ảnh xung xung quanh điểm đó. Hàm trọng số Gauss chỉ nhờ vào vào khoảng cách trong không gian so với điểm ảnh trung tâm, không suy xét sự đối sánh giữa nút xám của điểm nóng với những điểm bao phủ đó. Nó cũng không thân mật rằng điểm hình ảnh trung trung khu có nằm ở một đường biên giới trong hình ảnh không, chính vì như vậy làm nhòe luôn luôn các đường giáp ranh biên giới trong ảnh.

Bộ lọc Bilateral cũng sử dụng một bộ lọc Gauss với khoảng cách đến điểm trung tâm, bảo đảm chỉ có những điểm ở ngay gần tham gia vào cực hiếm của điểm hình ảnh trung tâm. Thế nhưng nó thực hiện thêm một hàm Gauss đến mức xám, đảm bảo an toàn chỉ những điểm hình ảnh có nấc xám tương đương với điểm ảnh trung trọng tâm tham gia vào quá trình làm mịn. Chính vì như thế bộ thanh lọc Bilateral bảo toàn được các đường biên trong hình ảnh bởi vì chưng điểm ảnh ở biên bao gồm sự thay đổi về nấc xám rất rõ ràng ràng. Rộng nữa, nỗ lực vì chuyển động trên các kênh color một cách riêng rẽ như cỗ lọc mức độ vừa phải hay bộ lọc Gauss, cỗ lọc Bilateral thi hành vấn đề đo đạc màu sắc có nhà đích trong không khí màu CIE-Lab , có tác dụng mượt màu với bảo toàn các biên theo hướng phù hợp hơn với nhận thức con người.

Tuy vậy, cỗ lọc Bilateral cũng có nhược điểm là chậm chạp hơn các bộ thanh lọc khác.

Sau đấy là cách áp dụng bộ thanh lọc Bilateral trong OpenCV:

Kết quả: Hình 1 sử dụng phép thanh lọc Bilateral, hình 2 thực hiện phéo lọc Gauss. Thử chạy với các phép lọc khác nhé.

Như bạn cũng có thể thấy, những texture được lọc tốt nhất có thể trong khi các đường biên trong ảnh vẫn được bảo toàn, không trở nên mờ đi.

Hình 1: Phép thanh lọc Bilateral

Hình 2: Phép lọc Gauss

Các chúng ta có thể tìm hiểu thêm về bộ lọc Bilateral tại: http://people.csail.mit.edu/sparis/bf_course/.

C. Một số bộ lọc tìm biên ảnh

Ngoài bài toán làm mịn ảnh, một số bộ thanh lọc còn có tác dụng tìm biên của ảnh.

1. Liên hệ giữa đạo hàm với biên ảnh

Xét vị dụ sau: Ta tất cả một hình ảnh (1) với 2 biên đã được thiết kế mờ. Hình (2) cho thấy mức xám tại con đường quét red color của ảnh. Thuận lợi nhận thấy những đường biên hình ảnh chính là 2 khoảng có sự thay đổi đột ngột về nút xám. Để xác minh những sự thay đổi này, ta thực hiện đạo hàm của dải nút xám cùng tìm các cực trị (địa phương) bên trên đó. Có thể thấy rõ mối contact giữa những cực trị địa phương của đạo hàm với các biên trong ảnh.

Liên hệ thân đạo hàm cùng biên ảnh

2. Gradient của bức ảnh

Vậy là các biên của ảnh sẽ tất cả quan hệ cùng với đạo hàm theo chiều x với đạo hàm theo hướng y của nấc xám. Gradient của hình ảnh là một đại lượng véc tơ hình thành từ 2 đạo hàm này và sẽ được sử dụng để lọc biên vào ảnh.

Công thức của Gradient là:

$$riangledown f = eginbmatrix fracpartial fpartial x , fracpartial fpartial y endbmatrix$$

3. Sobel với Scharr

Phép Sobel là sự kết hợp giữa có tác dụng mịn Gauss cùng phép vi phân, vì thế nó ít bị tác động bởi nhiễu.

Việc phối hợp này không phải là việc lọc nhiễu bởi phép Gauss trước, rồi thực hiện Sobel để tìm biên mà lại phép Gauss với Sobel đang được phối hợp để tạo thành một ma trân thanh lọc (kernel) rồi kế tiếp nhân chập ma trận này cùng với ảnh. Hãy thuộc xem tại sao có thể làm được như vậy:

Xét một hàm nấc xám $f$ , ma trận thanh lọc Gauss $h$, ta gồm công thức:

$$fracpartialpartial xleft( h * fight) =left( fracpartialpartial x hight) * f$$

Như vậy, chũm vì áp dụng bộ thanh lọc Gauss lên ảnh (kích thước tương đối lớn) rồi áp dụng lọc Sobel nhằm tìm biên, ta rất có thể áp dụng phép Sobel lên ma trận Gauss (kích thước nhỏ) rồi tiếp đến nhân chập ma trận nhận được với ảnh để cho ra hiệu quả tương tự. Việc này sẽ bớt đáng kể giá cả tính toán.

Trong OpenCV, bạn có thể chỉ định được phía đạo hàm (theo chiều ngang tuyệt chiều dọc). Chúng ta cũng có thể chỉ định kích thước ma trận thanh lọc với tham số ksize. Trường hợp ksize = -1, cỗ lọc Scharr 3×3 sẽ tiến hành sử dụng thay vì Sobel 3×3 nhằm có kết quả tốt hơn.

4. Laplacian

Laplacian được tính theo công thức:

$$Delta src = fracpartial ^2srcpartial x^2 + fracpartial ^2srcpartial y^2$$

Với ksize = 1, ma trận lọc sẽ tiến hành sử dụng là:

$$kernel = eginbmatrix 0 & 1 & 0 1 & -4 & 1 0 & 1 & 0 endbmatrix$$

Cài đặt Sobel với Laplace trong OpenCV:

1import numpy as np 2import cv2 as cv 3from matplotlib import pyplot as plt 4img = cv.imread('dave.jpg',0) 5laplacian = cv.Laplacian(img,cv.CV_64F) 6sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize=5) 7sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize=5) 8plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray') 9plt.title('Original'), plt.xticks(), plt.yticks()10plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')11plt.title('Laplacian'), plt.xticks(), plt.yticks()12plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')13plt.title('Sobel X'), plt.xticks(), plt.yticks()14plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')15plt.title('Sobel Y'), plt.xticks(), plt.yticks()16plt.show()Kết quả:

Vấn đề quan trọng khi lập trình sẵn với Python – OpenCV:

Trong lấy một ví dụ cuối, kiểu dữ liệu đầu ra là cv.CV_8U tốt np.uint8. Tất cả một sự việc với nó. Những chuyển dịch từ đen sang trắng (sự chuyển màu trên ảnh) có thông số góc dương, các chuyển đổi từ white sang black lại có thông số góc âm. Vì chưng vậy, khi chúng ta chuyển dữ liệu sang np.uint8, những hệ số góc âm sẽ tiến hành chuyển thành 0. Thế nên bạn mất các cạnh làm việc chỗ color chuyển từ đen sang trắng.

Để nhận toàn bộ các đường biên, chúng ta phải chuyển kết quả sang hình dáng cv.CV_16S, cv.CV_64F, hoặc một hình trạng khác lưu giữ trữ lớn hơn np.uint8, mang giá trị hoàn hảo nhất và đưa lại về np.uint8.

Xem thêm: Gốc Axit Là Gì ? Và Những Điều Xoay Quanh Axit Gốc Axit Là Gì, Phân Biệt Tính Axit Và Tính Kiềm

Đoạn code sau đây sẽ mô tả quy trình thực hiện. Ảnh đầu vào là 1 trong những hình chữ nhật trắng trên nền đen. Ta triển khai việc search cạnh theo hướng ngang (lấy những cạnh dọc). Nếu áp dụng kiểu tài liệu np.uint8, lân cận phải bị mất (do cạnh này được hình thành vị sự gửi dịch white color -> đen). Để có cả hai cạnh, ta nên làm như cách đã nêu trên.

1import numpy as np 2import cv2 as cv 3from matplotlib import pyplot as plt 4img = cv.imread('box.png',0) 5# đầu ra dtype = cv.CV_8U 6sobelx8u = cv.Sobel(img,cv.CV_8U,1,0,ksize=5) 7# đầu ra dtype = cv.CV_64F. Then take its absolute and convert to lớn cv.CV_8U 8sobelx64f = cv.Sobel(img,cv.CV_64F,1,0,ksize=5) 9abs_sobel64f = np.absolute(sobelx64f)10sobel_8u = np.uint8(abs_sobel64f)11plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')12plt.title('Original'), plt.xticks(), plt.yticks()13plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')14plt.title('Sobel CV_8U'), plt.xticks(), plt.yticks()15plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')16plt.title('Sobel abs(CV_64F)'), plt.xticks(), plt.yticks()17plt.show()