Bộ lọc trung bình Python

Thực tế là việc áp dụng bộ lọc trung vị với kích thước cửa sổ 1 sẽ không thay đổi mảng cho phép chúng ta tự do áp dụng bộ lọc trung vị theo hàng hoặc theo cột

Ví dụ, mã này

from scipy.ndimage import median_filter
import numpy as np

arr = np.array[[[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]]
median_filter[arr, size=3, cval=0, mode='constant']
#with cval=0, mode='constant' we set that input array is extended with zeros 
#when window overlaps edges, just for visibility and ease of calculation

xuất ra một mảng được lọc dự kiến ​​với cửa sổ [3, 3]

array[[[0., 2., 0.],
       [2., 5., 3.],
       [0., 5., 0.]]]

bởi vì median_filter tự động mở rộng

array[[[0., 2., 0.],
       [2., 5., 3.],
       [0., 5., 0.]]]
4 cho tất cả các kích thước, do đó chúng ta có thể nhận được hiệu ứng tương tự với

Tôi hiện đang làm việc trong một dự án thị giác máy tính và tôi muốn xem xét quá trình tiền xử lý hình ảnh để giúp cải thiện các mô hình máy học mà tôi đang dự định xây dựng. Tiền xử lý hình ảnh liên quan đến việc áp dụng các bộ lọc hình ảnh cho một hình ảnh. Bài viết này sẽ so sánh một số bộ lọc ảnh nổi tiếng nhất

Bộ lọc hình ảnh có thể được sử dụng để giảm lượng nhiễu trong ảnh và tăng cường các cạnh trong ảnh. Có hai loại nhiễu có thể xuất hiện trong ảnh. tiếng ồn lốm đốm và tiếng ồn muối tiêu. Nhiễu đốm là nhiễu xuất hiện trong quá trình thu ảnh trong khi nhiễu hạt tiêu [nghĩa là các pixel trắng và đen xuất hiện rải rác] là do nhiễu đột ngột trong tín hiệu hình ảnh. Tăng cường các cạnh của hình ảnh có thể giúp mô hình phát hiện các tính năng của hình ảnh

Một bước tiền xử lý hình ảnh có thể cải thiện độ chính xác của các mô hình máy học. Các hình ảnh được xử lý trước có thể giúp một mô hình cơ bản đạt được độ chính xác cao khi so sánh với một mô hình phức tạp hơn được đào tạo trên các hình ảnh chưa được xử lý trước. Đối với Python, các gói Open-CV và PIL cho phép bạn áp dụng một số bộ lọc kỹ thuật số. Áp dụng bộ lọc kỹ thuật số liên quan đến việc lấy tích chập của một hình ảnh với một hạt nhân [một ma trận nhỏ]. Hạt nhân là ma trận vuông cấp n x n với n là số lẻ. Nhân phụ thuộc vào bộ lọc kỹ thuật số. Hình 1 cho thấy hạt nhân được sử dụng cho bộ lọc trung bình 3 x 3. Một hình ảnh từ bộ dữ liệu KDEF [có thể tìm thấy ở đây. http. //kdef. se/] sẽ được sử dụng cho các ví dụ về bộ lọc kỹ thuật số

Hình 1. Hạt nhân bộ lọc trung bình 3 x 31. Bộ lọc trung bình

Bộ lọc trung bình được sử dụng để làm mờ hình ảnh nhằm loại bỏ nhiễu. Nó liên quan đến việc xác định giá trị trung bình của các giá trị pixel trong nhân n x n. Cường độ pixel của phần tử trung tâm sau đó được thay thế bằng giá trị trung bình. Điều này giúp loại bỏ một số nhiễu trong hình ảnh và làm mịn các cạnh của hình ảnh. Chức năng làm mờ từ thư viện Open-CV có thể được sử dụng để áp dụng bộ lọc trung bình cho hình ảnh

Khi xử lý ảnh màu, trước tiên cần chuyển đổi từ RGB sang HSV vì kích thước của RGB phụ thuộc vào nhau trong khi ba chiều trong HSV độc lập với nhau [điều này cho phép chúng tôi áp dụng các bộ lọc cho từng chiều trong số ba chiều . ]

Sau đây là triển khai python của bộ lọc trung bình

import numpy as npimport cv2from matplotlib import pyplot as pltfrom PIL import Image, ImageFilter%matplotlib inlineimage = cv2.imread['AM04NES.JPG'] # reads the imageimage = cv2.cvtColor[image, cv2.COLOR_BGR2HSV] # convert to HSVfigure_size = 9 # the dimension of the x and y axis of the kernal.new_image = cv2.blur[image,[figure_size, figure_size]]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[cv2.cvtColor[image, cv2.COLOR_HSV2RGB]],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[cv2.cvtColor[new_image, cv2.COLOR_HSV2RGB]],plt.title['Mean filter']plt.xticks[[]], plt.yticks[[]]plt.show[]

Hình 2. Kết quả của việc áp dụng bộ lọc trung bình cho ảnh màu

Hình 2 cho thấy rằng mặc dù một số nhiễu hạt đã giảm nhưng vẫn có một số tạo tác hiện có trong ảnh mà trước đây không có. Chúng tôi có thể kiểm tra xem liệu có bất kỳ thành phần tạo tác nào được tạo ra hay không khi bộ lọc trung bình được áp dụng cho hình ảnh thang độ xám

# The image will first be converted to grayscale
image2 = cv2.cvtColor[image, cv2.COLOR_HSV2BGR]
image2 = cv2.cvtColor[image2, cv2.COLOR_BGR2GRAY]figure_size = 9new_image = cv2.blur[image2,[figure_size, figure_size]]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[image2, cmap='gray'],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[new_image, cmap='gray'],plt.title['Mean filter']plt.xticks[[]], plt.yticks[[]]plt.show[]

Hình 3. Kết quả của việc áp dụng bộ lọc trung bình cho ảnh thang độ xám

Hình 3 cho thấy rằng lọc trung bình sẽ loại bỏ một số nhiễu và không tạo ra các thành phần giả cho ảnh thang độ xám. Tuy nhiên, một số chi tiết đã bị mất

2. Bộ lọc Gaussian

Bộ lọc Gaussian tương tự như bộ lọc trung bình tuy nhiên nó liên quan đến mức trung bình có trọng số của các pixel xung quanh và có tham số sigma. Hạt nhân đại diện cho một xấp xỉ rời rạc của phân phối Gaussian. Mặc dù bộ lọc Gaussian làm mờ các cạnh của hình ảnh [như bộ lọc trung bình], nhưng nó thực hiện công việc bảo toàn các cạnh tốt hơn so với bộ lọc trung bình có kích thước tương tự. Chức năng 'GaussianBlur' từ gói Open-CV có thể được sử dụng để triển khai bộ lọc Gaussian. Chức năng cho phép bạn chỉ định hình dạng của hạt nhân. Bạn cũng có thể chỉ định riêng độ lệch chuẩn cho hướng x và y. Nếu chỉ có một giá trị sigma được chỉ định thì nó được coi là giá trị sigma cho cả hai hướng x và y

new_image = cv2.GaussianBlur[image, [figure_size, figure_size],0]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[cv2.cvtColor[image, cv2.COLOR_HSV2RGB]],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[cv2.cvtColor[new_image, cv2.COLOR_HSV2RGB]],plt.title['Gaussian Filter']plt.xticks[[]], plt.yticks[[]]plt.show[]

hinh 4. Kết quả của việc áp dụng bộ lọc Gaussian cho ảnh màu

Hình 4 cho thấy Bộ lọc Gaussian thực hiện tốt hơn việc giữ lại các cạnh của hình ảnh khi so sánh với bộ lọc trung bình, tuy nhiên, nó cũng tạo ra các thành phần giả trên ảnh màu. Bây giờ chúng ta có thể kiểm tra xem liệu bộ lọc Gaussian có tạo ra các tạo tác trên một hình ảnh thang độ xám hay không

new_image_gauss = cv2.GaussianBlur[image2, [figure_size, figure_size],0]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[image2, cmap='gray'],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[new_image_gauss, cmap='gray'],plt.title['Gaussian Filter']plt.xticks[[]], plt.yticks[[]]plt.show[]

Hình 5. Kết quả của việc áp dụng bộ lọc Gaussian cho ảnh thang độ xám

Hình 5 cho thấy bộ lọc Gaussian 9 x 9 không tạo ra hiện vật khi áp dụng cho ảnh thang độ xám. Bộ lọc có thể giữ lại nhiều chi tiết hơn bộ lọc trung bình 9 x 9 và loại bỏ một số nhiễu

3. Bộ lọc trung vị

Bộ lọc trung vị tính trung bình của cường độ pixel bao quanh pixel trung tâm trong nhân n x n. Sau đó, trung vị sẽ thay thế cường độ pixel của pixel trung tâm. Bộ lọc trung bình thực hiện công việc loại bỏ nhiễu muối và hạt tiêu tốt hơn so với bộ lọc trung bình và bộ lọc Gaussian. Bộ lọc trung bình bảo toàn các cạnh của hình ảnh nhưng nó không xử lý nhiễu lốm đốm. Chức năng 'medianBlur' từ thư viện Open-CV có thể được sử dụng để triển khai bộ lọc trung vị

new_image = cv2.medianBlur[image, figure_size]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[cv2.cvtColor[image, cv2.COLOR_HSV2RGB]],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[cv2.cvtColor[new_image, cv2.COLOR_HSV2RGB]],plt.title['Median Filter']plt.xticks[[]], plt.yticks[[]]plt.show[]

Hình 6. Kết quả của việc áp dụng bộ lọc trung vị cho ảnh màu

Hình 6 cho thấy bộ lọc trung vị có thể giữ lại các cạnh của hình ảnh trong khi loại bỏ nhiễu muối tiêu. Không giống như bộ lọc trung bình và bộ lọc Gaussian, bộ lọc trung vị không tạo ra các thành phần giả trên ảnh màu. Bộ lọc trung vị bây giờ sẽ được áp dụng cho hình ảnh thang độ xám

new_image = cv2.medianBlur[image2, figure_size]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[image2, cmap='gray'],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[new_image, cmap='gray'],plt.title['Median Filter']plt.xticks[[]], plt.yticks[[]]plt.show[]

Hình 7. Kết quả của việc áp dụng bộ lọc trung vị cho ảnh thang độ xám

Hình 7 cho thấy bộ lọc trung vị 9 x 9 có thể loại bỏ một số nhiễu hạt tiêu trong khi vẫn giữ lại các cạnh của hình ảnh

Bộ lọc khác

Dưới đây là một số bộ lọc khác có thể được sử dụng để xử lý trước hình ảnh

Bộ lọc bảo thủ

Bộ lọc bảo thủ được sử dụng để loại bỏ tiếng ồn của muối và hạt tiêu. Xác định cường độ tối thiểu và cường độ tối đa trong vùng lân cận của pixel. Nếu cường độ của pixel trung tâm lớn hơn giá trị tối đa thì nó được thay thế bằng giá trị tối đa. Nếu nó nhỏ hơn giá trị tối thiểu thì nó được thay thế bằng giá trị tối thiểu. Bộ lọc thận trọng bảo tồn các cạnh nhưng không loại bỏ nhiễu lốm đốm

Đoạn mã sau có thể được sử dụng để xác định bộ lọc bảo thủ

________số 8

Giờ đây, bộ lọc thận trọng có thể được áp dụng cho hình ảnh thang độ xám

new_image = conservative_smoothing_gray[image2,5]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[image2, cmap='gray'],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[new_image, cmap='gray'],plt.title['Conservative Smoothing']plt.xticks[[]], plt.yticks[[]]plt.show[]

Hình 9. Kết quả của việc áp dụng bộ lọc làm mịn bảo thủ cho ảnh thang độ xám

Hình 9 cho thấy bộ lọc làm mịn bảo thủ có thể loại bỏ một số nhiễu muối tiêu. Nó cũng gợi ý rằng bộ lọc không thể loại bỏ nhiều nhiễu hạt tiêu như bộ lọc trung bình [mặc dù nó giữ được nhiều chi tiết hơn. ]

Bộ lọc Laplacian

Laplacian của một hình ảnh làm nổi bật các khu vực có cường độ thay đổi nhanh chóng và do đó có thể được sử dụng để phát hiện cạnh. Nếu chúng ta để I[x,y] đại diện cho cường độ của ảnh thì Laplacian của ảnh được cho bởi công thức sau

Có thể xác định xấp xỉ rời rạc của Laplacian tại một pixel cụ thể bằng cách lấy giá trị trung bình có trọng số của cường độ pixel trong một vùng lân cận nhỏ của pixel. Hình 10 cho thấy hai hạt nhân đại diện cho hai cách khác nhau để tính xấp xỉ Laplacian

Hình 10. Hai hạt nhân được sử dụng để ước tính Laplacian

Vì bộ lọc Laplacian phát hiện các cạnh của hình ảnh nên nó có thể được sử dụng cùng với bộ lọc Gaussian để trước tiên loại bỏ nhiễu lốm đốm và sau đó làm nổi bật các cạnh của hình ảnh. Phương pháp này được gọi là lọc Laplacian của Gaussian. Chức năng 'Laplacian' từ thư viện Open-CV có thể được sử dụng để tìm Laplacian của một hình ảnh

array[[[0., 2., 0.],
       [2., 5., 3.],
       [0., 5., 0.]]]
0

Hình 11. Kết quả của việc thêm Laplacian của một hình ảnh vào hình ảnh gốc

Hình 11 cho thấy rằng trong khi thêm Laplacian của ảnh vào ảnh gốc có thể tăng cường các cạnh, một số nhiễu cũng được tăng cường

Bộ lọc tần số

Khi áp dụng các bộ lọc tần số cho một hình ảnh, điều quan trọng trước tiên là chuyển đổi hình ảnh thành biểu diễn miền tần số của hình ảnh. Biến đổi Fourier [phân rã một hàm thành các thành phần sin và cosin của nó] có thể được áp dụng cho một hình ảnh để có được biểu diễn miền tần số của nó. Lý do chúng ta quan tâm đến biểu diễn miền tần số của hình ảnh là vì việc áp dụng các bộ lọc tần số cho một hình ảnh trong miền tần số sẽ ít tốn kém hơn so với việc áp dụng các bộ lọc trong miền không gian. Điều này là do thực tế là mỗi pixel trong biểu diễn miền tần số tương ứng với một tần số chứ không phải vị trí của hình ảnh

Bộ lọc thông thấp và bộ lọc thông cao đều là bộ lọc tần số. Bộ lọc thông thấp bảo toàn các tần số thấp nhất [dưới ngưỡng], nghĩa là nó làm mờ các cạnh và loại bỏ nhiễu lốm đốm khỏi hình ảnh trong miền không gian. Bộ lọc thông cao bảo toàn tần số cao có nghĩa là nó bảo toàn các cạnh. Hàm 'dft' xác định biến đổi Fourier rời rạc của ảnh. Đối với ảnh N x N, biến đổi Fourier rời rạc hai chiều được cho bởi

trong đó f là giá trị ảnh trong miền không gian và F trong miền tần số của nó. Sau đây là công thức cho phép biến đổi Fourier rời rạc nghịch đảo [chuyển đổi một hình ảnh từ miền tần số của nó sang miền không gian]

Khi một bộ lọc tần số được áp dụng cho một hình ảnh, biến đổi Fourier ngược có thể được sử dụng để chuyển đổi hình ảnh trở lại miền không gian. Bây giờ việc triển khai python của bộ lọc thông thấp sẽ được cung cấp

array[[[0., 2., 0.],
       [2., 5., 3.],
       [0., 5., 0.]]]
1

Hình 12. Biểu diễn miền không gian và miền tần số của ảnh____30

Hình 13. Kết quả của việc áp dụng bộ lọc thông thấp cho hình ảnh

Hình 13 cho thấy khá nhiều chi tiết bị mất tuy nhiên một số đốm nhiễu đã được loại bỏ

Loại bỏ đốm Crimmins

Thuật toán loại bỏ bổ sung Crimmins được sử dụng để loại bỏ nhiễu lốm đốm và làm mịn các cạnh. Nó cũng làm giảm cường độ của tiếng ồn muối tiêu. Thuật toán so sánh cường độ của một pixel trong ảnh với cường độ của 8 pixel lân cận. Thuật toán xét 4 tập láng giềng [N-S, E-W, NW-SE, NE-SW. ] Đặt a,b,c là ba pixel liên tiếp [ví dụ từ E-S]. Sau đó, thuật toán là

  1. Đối với mỗi lần lặp lại.
    a] Điều chỉnh pixel tối. Đối với mỗi hướng trong số bốn hướng
    1] Xử lý toàn bộ hình ảnh với. nếu a ≥ b+2 thì b = b + 1
    2] Xử lý toàn bộ hình ảnh với. nếu a > b và b ≤ c thì b = b + 1
    3] Xử lý toàn bộ hình ảnh với. nếu c > b và b ≤ a thì b = b + 1
    4] Xử lý toàn bộ hình ảnh với. nếu c ≥ b+2 thì b = b + 1
    b] Điều chỉnh điểm ảnh sáng. Đối với mỗi hướng trong số bốn hướng
    1] Xử lý toàn bộ hình ảnh với. nếu a ≤ b — 2 thì b = b — 1
    2] Xử lý toàn bộ hình ảnh với. nếu a < b và b ≥ c thì b = b — 1
    3] Xử lý toàn bộ hình ảnh với. if c < b and b ≥ a then b = b — 1
    4] Xử lý toàn bộ hình ảnh với. nếu c ≤ b — 2 thì b = b — 1

Việc triển khai Python của thuật toán loại bỏ bổ sung có thể được tìm thấy tại đây. https. //github. com/m4nv1r/medium_articles/blob/master/Image_Filters_in_Python. ipynb

Hình 14, cho thấy kết quả của việc áp dụng bộ lọc Crimmins Speckle Removal cho một hình ảnh. Một số đốm nhiễu đã được loại bỏ tuy nhiên một số cạnh bị mờ

Hình 14. Kết quả của việc áp dụng bộ lọc Crimmins Speckle Removal Bộ lọc Unsharp

Bộ lọc Unsharp có thể được sử dụng để cải thiện các cạnh của hình ảnh. Bộ lọc hình ảnh. Hàm Unsharpmask từ gói PIL áp dụng bộ lọc không sắc nét cho hình ảnh [hình ảnh trước tiên cần được chuyển đổi thành đối tượng Hình ảnh PIL. ] Bộ lọc hình ảnh. Hàm Unsharpmask có ba tham số. Tham số 'bán kính' chỉ định có bao nhiêu pixel lân cận xung quanh các cạnh bị ảnh hưởng. Tham số 'phần trăm' chỉ định các cạnh trở nên tối hơn hoặc sáng hơn bao nhiêu. Tham số thứ ba 'ngưỡng' xác định các giá trị âm liền kề phải cách nhau bao xa trước khi bộ lọc thực hiện bất kỳ điều gì

# The image will first be converted to grayscale
image2 = cv2.cvtColor[image, cv2.COLOR_HSV2BGR]
image2 = cv2.cvtColor[image2, cv2.COLOR_BGR2GRAY]figure_size = 9new_image = cv2.blur[image2,[figure_size, figure_size]]plt.figure[figsize=[11,6]]plt.subplot[121], plt.imshow[image2, cmap='gray'],plt.title['Original']plt.xticks[[]], plt.yticks[[]]plt.subplot[122], plt.imshow[new_image, cmap='gray'],plt.title['Mean filter']plt.xticks[[]], plt.yticks[[]]plt.show[]
1

Hình 15. Kết quả của việc áp dụng bộ lọc Unsharp

Hình 15 cho thấy kết quả của bộ lọc Unsharp. Trong khi các cạnh của hình ảnh được tăng cường, một số nhiễu cũng được tăng cường

Phần kết luận

Luôn có sự đánh đổi giữa việc loại bỏ nhiễu và giữ lại các cạnh của hình ảnh. Để loại bỏ nhiễu lốm đốm trong ảnh, cần áp dụng bộ lọc làm mờ để làm mờ các cạnh của ảnh. Nếu bạn muốn giữ lại các cạnh của hình ảnh, nhiễu duy nhất mà bạn có thể loại bỏ là nhiễu muối tiêu. Bạn có thể tìm thấy sổ ghi chép Jupyter với tất cả mã được sử dụng cho bài viết này tại đây. https. //github. com/m4nv1r/medium_articles/blob/master/Image_Filters_in_Python. ipynb

Bộ lọc trung bình Python là gì?

Bộ lọc trung vị . Chức năng 'medianBlur' từ thư viện Open-CV có thể được sử dụng để triển khai bộ lọc trung vị. preserves the edges of an image but it does not deal with speckle noise. The 'medianBlur' function from the Open-CV library can be used to implement a median filter.

Bộ lọc trung vị có phải là bộ lọc không gian không?

Bộ lọc trung vị không gian là một thuật toán làm mịn đồng nhất với mục đích loại bỏ nhiễu và các điểm nhỏ của dữ liệu hình ảnh trong khi vẫn duy trì các cạnh xung quanh các hình lớn hơn . Bộ lọc trung vị không gian dựa trên hàm lượng tử trung vị không gian được phát triển bởi P.

Bộ lọc trung vị có phải là bộ lọc làm mịn không?

Lọc trung bình là một loại kỹ thuật làm mịn , cũng như lọc Gaussian tuyến tính. Tất cả các kỹ thuật làm mịn đều có hiệu quả trong việc loại bỏ nhiễu trong các mảng mịn hoặc vùng mịn của tín hiệu, nhưng ảnh hưởng xấu đến các cạnh.

Chủ Đề