Java DIP - Áp dụng bộ lọc hộp
Chúng tôi áp dụng bộ lọc Hộp làm mờ hình ảnh. Bộ lọc Hộp có thể có kích thước 3x3, 5x5, 9x9, v.v.
Chúng tôi sử dụng OpenCV chức năng filter2Dđể áp dụng bộ lọc Hộp cho hình ảnh. Nó có thể được tìm thấy dướiImgprocgói hàng. Cú pháp của nó được đưa ra dưới đây:
filter2D(src, dst, depth , kernel, anchor, delta, BORDER_DEFAULT );
Các đối số của hàm được mô tả bên dưới:
Sr.No. | Lập luận & Mô tả |
---|---|
1 |
src Nó là hình ảnh nguồn. |
2 |
dst Nó là hình ảnh đích. |
3 |
depth Nó là độ sâu của dst. Giá trị âm (chẳng hạn như -1) chỉ ra rằng độ sâu giống với nguồn. |
4 |
kernel Nó là hạt nhân được quét qua ảnh. |
5 |
anchor Nó là vị trí của neo so với nhân của nó. Vị trí Điểm (-1, -1) cho biết trung tâm theo mặc định. |
6 |
delta Nó là một giá trị được thêm vào mỗi pixel trong quá trình tích chập. Theo mặc định, nó là 0. |
7 |
BORDER_DEFAULT Chúng tôi để giá trị này theo mặc định. |
Ngoài phương thức filter2D (), còn có các phương thức khác được cung cấp bởi lớp Imgproc. Chúng được mô tả ngắn gọn -
Sr.No. | Phương pháp & Mô tả |
---|---|
1 |
cvtColor(Mat src, Mat dst, int code, int dstCn) Nó chuyển đổi một hình ảnh từ không gian màu này sang không gian màu khác. |
2 |
dilate(Mat src, Mat dst, Mat kernel) Nó làm giãn hình ảnh bằng cách sử dụng một phần tử có cấu trúc cụ thể. |
3 |
equalizeHist(Mat src, Mat dst) Nó cân bằng biểu đồ của một hình ảnh thang độ xám. |
4 |
filter2D(Mat src, Mat dst, int depth, Mat kernel, Point anchor, double delta) Nó biến đổi một hình ảnh với hạt nhân. |
5 |
GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX) Nó làm mờ hình ảnh bằng cách sử dụng bộ lọc Gaussian. |
6 |
integral(Mat src, Mat sum) Nó tính tích phân của một hình ảnh. |
Thí dụ
Ví dụ sau minh họa việc sử dụng lớp Imgproc để áp dụng bộ lọc Hộp cho hình ảnh có Thang độ xám.
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
public class convolution {
public static void main( String[] args ) {
try {
int kernelSize = 9;
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
Mat source = Highgui.imread("grayscale.jpg", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
Mat destination = new Mat(source.rows(),source.cols(),source.type());
Mat kernel = Mat.ones(kernelSize,kernelSize, CvType.CV_32F);
for(int i=0; i<kernel.rows(); i++) {
for(int j=0; j<kernel.cols(); j++) {
double[] m = kernel.get(i, j);
for(int k =0; k<m.length; k++) {
m[k] = m[k]/(kernelSize * kernelSize);
}
kernel.put(i,j, m);
}
}
Imgproc.filter2D(source, destination, -1, kernel);
Highgui.imwrite("output.jpg", destination);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}
Đầu ra
Khi bạn thực thi mã đã cho, kết quả sau sẽ được nhìn thấy:
Ảnh gốc
Trong ví dụ này, chúng ta chuyển đổi hình ảnh của mình với bộ lọc (nhân) sau. Bộ lọc này dẫn đến làm mờ hình ảnh khi kích thước của nó tăng lên.
Hình ảnh gốc này đã được xử lý bằng bộ lọc hộp có kích thước 5, được đưa ra bên dưới -
Bộ lọc hộp cỡ 5
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |
1/25 | 1/25 | 1/25 | 1/25 | 1/25 |