Gaussian Blur Là Gì

     
bulongvietlong.com share mọi sản phẩm về trò chơi / ứng dụng / Thủ Thuật giành riêng cho máy tính với những tin hay nhất và phần đa thông tin kỹ năng và kiến thức hỏi đáp.

Lọc ảnh (làm mịn ảnh, làm cho mượt ảnh) là một trong bước rất đặc biệt quan trọng trong giải pháp xử lý ảnh. Lọc ảnh thực tế tất cả rất nhiều tính năng như sa thải nhiễu, tìm kiếm 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 hình ảnh cơ bản.

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

Đang xem: Gaussian blur là gì


A. Hiệ tượng chung của thanh lọc ảnh

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

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

Minh họa việc nhân ma trận ảnh. Hình hình ảnh được đem từ https://github.com/vdumoulin/conv_arithmetic

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

Trên thực tế, họ sẽ thấy có 2 phép lọc ảnh là đối sánh (correlation) với tích chập (convolution). Cùng với phép tương quan, ma trận lọc vẫn đượt trượt đi với nhân với từng vùng của ảnh như trên. Tuy nhiên 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 và dọc) trước khi thực hiện nhân. 2 phép toán này là tương đương 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ông giống nhau, không tồn tại một quy định ví dụ nào cho việc xác định M. Kích thước ma trận M là một vài lẻ. Ví dụ: 3×3, 5×5.

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

Tổng Tpt các phẩn tử vào ma trận M thường xuyên là 1.

Tpt > 1: Ảnh sau khi thực hiện chấm dứt phép lọc số ảnh (Idst) bao gồm độ sáng to hơn so với hình ảnh ban đầu (Isrc).**Tpt dst) tất cả độ sáng bé 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ố bộ lọc làm cho mịn ảnh

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

Đây là bộ lọc dễ dàng nhất. Nó được xuất bản dựa trên ý tưởng tính giá trị một điểm hình ảnh bằng trung bình cộng những điểm hình ảnh xung quanh nó.

Ma trận thanh lọc của lọc trung bình bao gồm 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 lọc này thường xuyên được áp dụng cho có tác dụng trơn ảnh vẫn ý muốn giữ lại biên không biến thành mờ.

Code với Python – OpenCV: Đoạn code sau sẽ thực hiện lọc ảnh với ma trận thanh lọc trung bình 5 x 5. Giữ ý: toàn cục mã nguồn với hình hình ảnh dùng trong nội dung bài viết có thể được download 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 và 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) to 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à hiệu quả sau khi chạy đoạn code trên:

Chú ý: bạn phải cài gói matplotlib (dùng pip) và tkinter để thực hiện với Python. Cùng với Python 3.6, việc cài đặt tkinter rất có thể sử dụng:

Trên thực tế, nuốm vì thực hiện hàm cv2.blur() thì bộ lọc trung bình có thể được thực hiện 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 thanh lọc trung bình bởi một ma trận khác, chúng ta cũng có thể có rất nhiều phép lọc khác như lọc thông phải chăng (low-pass filters(LPF)) hoặc lọc thông cao (high-pass filters(HPF) ).

2. Lọc Gauss (Gaussian Filter)

Bộ thanh lọc Gauss được cho là bộ lọc bổ ích 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 1 ma trận thanh lọc Gauss kế tiếp cộng bọn chúng lại để sản xuất thành ảnh đầu ra.

Ý tưởng chung là quý giá mỗi điểm hình ảnh sẽ nhờ vào nhiều vào những điểm hình ảnh ở sát hơn là những điểm hình ảnh ở xa. Trọng số của sự phụ thuộc được đem theo hàm Gauss (cũng được áp dụng trong quy luật trưng bày chuẩn).

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

Giả sử hình ảnh là một chiều. Điểm hình ảnh ở trung tâm sẽ sở hữu trọng số béo nhất. Những điểm ảnh ở càng xa trung tâm sẽ có trọng số sút dần khi khoảng cách từ bọn chúng tới điểm nóng tăng lên. Do vậy điểm càng ngay sát trung trung ương sẽ càng đóng góp góp nhiều hơn thế vào giá trị điểm trung tâm.

Chú ý: trên thực tế, bài toán lọc ảnh dựa bên trên hàm Gauss 2 chiều (ngang với dọc). Phân phối chuẩn 2 chiều có thể biểu diễ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à vừa đủ (đỉnh), $sigma^2$ là phương sai của các biến số $x$ cùng $y$.

Tham số $mu$ quyết định chức năng của cỗ lọc Gauss lên ảnh. Độ mập của ma trận thanh lọc (kernel) rất cần phải lựa chọn cho đủ rộng.

Code thực tế lọc Gauss với Python – OpenCV: trong OpenCV họ sử dụng hàm sau để lọc Gauss: cv.GaussianBlur().

Bạn cũng rất có thể tạo một ma trận thanh lọc Gauss và áp 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 & 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) to 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 trên đây là công dụng lọc thực hiện phép lọc Gauss.

Xem thêm: Meaning Of " Giò Lụa Tiếng Anh Là Gì ? Nghĩa Của Từ : Giò Lụa

Các bạn có thể thấy công dụng lọc (Gauss noise) cực tốt mà hình hình ảnh không bị chói nhiều như phép thanh lọc trung bình như trên.

3. Thanh lọc trung vị

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

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

Để áp dụng lọc trung vị trong OpenCV, ta cần sử dụng hàm: cv.medianBlur().

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

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

Có thể thấy rõ, với câu hỏi lọc trung vị, nhiễu muối tiêu sẽ được vứt bỏ tốt hơn những so với thanh lọc trung bình tuyệt lọc Gauss.

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

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

Như chúng ta đã biết, cỗ lọc Gauss đưa ra quyết định giá trị một điểm ảnh bằng bí quyết lấy mức độ vừa phải theo hàm Gauss những giá trị điểm hình ảnh xung quanh điểm đó. Hàm trọng số Gauss chỉ dựa vào vào khoảng cách trong không khí so với điểm hình ảnh trung tâm, không suy nghĩ sự đối sánh giữa nút xám của điểm nóng với những điểm bao quanh đó. Nó cũng không niềm nở rằng điểm ảnh trung chổ chính giữa có nằm ở vị trí một đường biên giới trong ảnh không, chính vì như thế 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 áp dụng một cỗ lọc Gauss với khoảng cách đến điểm trung tâm, bảo đảm an toàn chỉ có những điểm ở sát tham gia vào quý giá của điểm hình ảnh trung tâm. Mặc dù vậy nó thực hiện thêm một hàm Gauss đến mức xám, đảm bảo chỉ những điểm ảnh có mức xám tương đồng với điểm hình ảnh trung chổ chính giữa tham gia vào quá trình làm mịn. Vì vậy bộ lọc Bilateral bảo toàn được các đường biên trong ảnh bởi bởi vì điểm ảnh ở biên tất cả sự thay đổi về nút xám rất rõ ràng ràng. Hơn nữa, thế vì chuyển động trên những kênh màu sắc một phương pháp riêng rẽ như bộ lọc trung bình hay bộ lọc Gauss, bộ lọc Bilateral thi hành bài toán đo đạc color có nhà đích trong không gian màu CIE-Lab , làm mượt màu cùng bảo toàn các biên theo hướng cân xứng hơn với dấn thức nhỏ người.

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

Sau đó là cách sử dụng bộ thanh lọc Bilateral trong OpenCV:

Kết quả: Hình 1 sử dụng phép lọc Bilateral, hình 2 sử dụng phéo lọc Gauss. Thử chạy với những phép lọc không giống nhé.

Như chúng ta cũng có thể thấy, các texture được lọc tốt nhất trong khi những đườ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 vài bộ lọc tra cứu biên ảnh

Ngoài việc làm mịn ảnh, một vài bộ lọc còn có công dụng tìm biên của ảnh.

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

Xét vị dụ sau: Ta gồm một hình hình ảnh (1) cùng với 2 biên đã được làm mờ. Hình (2) cho biết mức xám tại đường quét red color của ảnh. Tiện lợi nhận thấy những đường biên hình ảnh chính là 2 khoảng có sự biến hóa đột ngột về mức xám. Để khẳng định những sự đổi khác này, ta thực hiện đạo hàm của dải nút xám cùng tìm những cực trị (địa phương) bên trên đó. Có thể thấy rõ mối liên hệ giữa những cực trị địa phương của đạo hàm với những biên vào ả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ệ với đạo hàm theo chiều x và đạo hàm theo chiều y của nút xám. Gradient của ảnh là một đại lượng véc tơ xuất hiện từ 2 đạo hàm này và sẽ được sử dụng nhằm 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à Scharr

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

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

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

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

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

Trong OpenCV, chúng ta cũng có thể chỉ định được hướng đạo hàm (theo chiều ngang tuyệt chiều dọc). Chúng ta có thể chỉ định size ma trận lọc với thông số ksize. Ví như ksize = -1, bộ lọc Scharr 3×3 sẽ được sử dụng thay vì chưng Sobel 3×3 nhằm có hiệu 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ẽ được sử dụng là:

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

Cài đặt Sobel và Laplace vào 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 đề đặc biệt quan trọng khi thiết kế với Python – OpenCV:

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

Để nhận tất cả các con đường biên, các bạn phải chuyển công dụng sang loại cv.CV_16S, cv.CV_64F, hoặc một phong cách khác lưu giữ trữ to hơn np.uint8, rước giá trị hoàn hảo và đưa lại về np.uint8.

Xem thêm: Bếp Ga Có Lò Nướng Của Nhật Bãi, Bếp Ga Nội Địa Nhật Bãi Cao Cấp

Đoạn code sau đây sẽ mô tả quá trình thực hiện. Ảnh đầu vào là một trong hình chữ nhật white trên nền đen. Ta triển khai việc tìm cạnh theo hướng ngang (lấy những cạnh dọc). Nếu áp dụng kiểu dữ liệu np.uint8, ở kề bên phải bị mất (do cạnh đó được hình thành do sự đưa dịch màu trắng -> đen). Để có cả 2 cạnh, ta đề xuất làm như biện pháp đã 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# output đầ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 khổng lồ 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()