Image Transforms với opencv

1.Convolution (tích chập).

Tích chập là cơ sở của nhiều phép biến đổi. Theo toán học, tích chập là phép toán tuyến tính, cho ra kết quả là một hàm bằng việc tính toán dựa trên hai hàm đã có (f và g).
Công thức tích chập giữa hàm ảnh f(x, y) và bộ lọc k(x, y) (kích thước mxn):

Thành phần không thể thiếu của phép tích chập là ma trận kernel (bộ lọc). Điểm neo (anchor point) của kernel sẽ quyết định vùng ma trận tương ứng trên ảnh để tích chập, thông thường anchor point được chọn là tâm của kernel. Giá trị mỗi phần tử trên kernel được xem như là hệ số tổ hợp với lần lượt từng giá trị độ xám của điểm ảnh trong vùng tương ứng với kernel.
Phép tích chập được hình dung thực hiện bằng việc dịch chuyển ma trận kernel lần lượt qua tất cả các điểm ảnh trong ảnh, bắt đầu từ góc bên trái trên của ảnh. Và đặt điểm neo tương ứng tại điểm ảnh đang xét. Ở mỗi lần dịch chuyển, thực hiện tính toán kết quả mới cho điểm ảnh đang xét bằng công thức tích chập.
Ví dụ:


Kí hiệu : (1) là ảnh nguồn, (2) là ma trận kernel, (3) là ảnh kết quả .
Khi kernel vượt qua khỏi ảnh thì bỏ qua vùng ở ngoài biên, không cho vào kết quả.Còn một số cách sử lí khác như : sử dụng hằng số, …

2. Phương pháp tìm biên Gradient và kĩ thuật Sobel

Phương pháp gradient tìm biên dựa vào sự biến thiên về giá trị độ sáng của ảnh.  Chủ yếu dựa vào kĩ thuật lấy đạo hàm. Ta tính toán ước lượng độ lớn gradient bằng cách sử dụng bộ lọc làm mịn và sử dụng dự đoán tính toán để xác định vị trí của biên. Nói cách khác phương pháp gradient là phương pháp dò biên cục bộ bằng cách tìm kiếm cực đại và cực tiểu khi lấy đạo hàm bậc nhất của ảnh.
Toán tử Sobel:
Ở đây sử dụng hai mặt nạ nhân chập 3 * 3 theo hướng x, y với hình ảnh đa mức xám.
Theo hướng x.

Theo hướng y.


Sử dụng phương pháp Sobel với opencv:

Sobel( src_gray, dst, int  ddepth, int xorder, int yorder, ksize, double scale, double delta, double_type );
Trong đó:
Src_gray: là ảnh đầu vào.
Dst: là ảnh đầu ra.
ddepth : là cách biểu diễn ảnh kết quả, VD: CV_32F, CV_64F.
Xorder: là đạo hàm theo phương x.
Yorder: là đạo hàm theo phương y.
nếu đạo hàm theo phương nào thì đặt giá trị đó bằng 1.
Ksize: là kích thước của ma trận kernel, mặc định là = 3.
scale và delta: là 2 thông số tùy chọn cho việc tính giá trị đạo hàm lưu giá trị vi sai vào ảnh sau phép lọc. Mặc định là 1 và 0.
Double_type: là phương pháp để ước lượng và căn chỉnh các điểm ảnh nếu phép lọc chúng vượt ra khỏi giới hạn của ảnh. giá trị mặc định là 4.

Scharr Filter
Scharr sử dụng mặt nạ nhân chập theo hai hướng x,y như sau.


3. Phương pháp Laplace.

Phương pháp gradient  làm việc khá tốt khi độ sáng thay đổi rõ nét, khi mức xám thay đổi chậm hoặc miền chuyển tiếp trải rộng thì phương pháp này tỏ ra kém hiệu quả. Vậy nên người ta sử dụng phương pháp laplace để khắc phục nhược điểm này.
Trong phương pháp ta lấy đạo hàm bậc hai của các tín hiệu và biên độ đạo hàm là cực đại khi đạo hàm bậc hai bằng 0. Và điểm không là duy nhất do vậy kĩ thuật này cho đường biên rất mảnh (Rộng 1 pixel). Rất nhạy cảm với nhiễu do đạo hàm bậc 2 không ổn định.
Ma trận lọc (Kernel) của bộ lọc Laplace có dạng:


Trong thực tế, người ta dùng nhiều kiểu ma trận lọc (Kernel) khác nhau để xấp xỉ rời rạc đạo hàm bậc hai Laplace. 3 kiểu ma trận lọc (Kernel) thường dùng:


Cài đặt bộ lọc Laplace trong opencv:
cv::Laplace( src, dst, int ddepth, int ksize = 1, double scale = (1,0), double delta = (0,0), int borderType = 4);
Trong đó:
Src: là ảnh đầu vào.
Dst: là ảnh đầu ra.
ddepth : là cách biểu diễn ảnh kết quả, VD: CV_32F, CV_64F.
Ksize: là kích thước của ma trận kernel, mặc định là = 3.
scale và delta: là 2 thông số tùy chọn cho việc tính giá trị đạo hàm lưu giá trị vi sai vào ảnh sau phép lọc. Mặc định là 1 và 0.
Double_type: là phương pháp để ước lượng và căn chỉnh các điểm ảnh nếu phép lọc chúng vượt ra khỏi giới hạn của ảnh. giá trị mặc định là 4.

4.Phương pháp phát hiện biên Canny

Các bước của thuật toán Canny:

Bước 1: Giảm nhiễu: làm trơn ảnh để loại bỏ nhiễu bằng cách nhân chập
ảnh với bộ lọc Gauss.
Bước 2: Tìm gradient: Tính toán góc và chiều dài của gradient. Biên nên
được đánh dấu nơi mà gradient của ảnh có chiều dài lớn.
Bước 3: Thực hiện “Non-maximum suppression”: Chỉ cực đại cục bộ
những điểm được đánh dấu là biên (có mức xám cao).
Bước 4: Sử dụng ngưỡng đôi: Những biên tiềm năng được xác định bởi
ngưỡng cao và ngưỡng thấp.
Cài đặt phương pháp canny trong opencv:

Canny( src, dst, lowThreshold, upperThreshold, kernel_size );
Trong đó:
src : là ảnh đầu vào, ảnh xám.
dst: ảnh đầu ra.
lowThreshold: ngưỡng dưới.
upperThreshold: ngưỡng trên.
Kernel_size: kích thước kernel dùng trong Sobel

5.Hough transform

Phép biến đổi Hough dùng để phát hiện các hình dạng khác nhau. OpenCV có HoughCircles để phát hiện đường tròn và elip, HoughLines để phát hiện đường thẳng, cuối cùng là HoughLinesP cũng tương tự HoughLines nhưng ít tính toán hơn.

Hough Lines:
HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )
Trong đó:
image – ảnh nhị phân đầu vào
lines – Output là vector chứa các đường thẳng. Mỗi đường thẳng chứa 2 giá trị (ρ, θ)
rho – Khoảng cách của các đường thẳng tính bằng pixels
theta – Khoảng cách góc của các đường thẳng tính bằng radians
threshold – Đường thẳng nào có số pixel lớn hơn threshold mới lấy
srn – Dùng cho multi-scale
stn – Cũng dùng cho multi-scale

Phép biển đổi HoughLines phải tính toán quá nhiều để tìm đường thẳng, thì phép biến đổi Probabilistic Hough tối ưu hơn, ít tính toán hơn. Nó không kiểm tra tất cả các pixel mà chỉ lấy 1 số cụm pixel vừa đủ để tìm ra đường thẳng.
Phép biến đổi này có thêm hai tham số nữa:
minLineLength: độ dài tối thiểu của một đường thẳng
maxLineGap: nếu hai đường thẳng có đoạn đứt gãy ở nhỏ hơn maxLineGap thì nó được coi là một đường thẳng

Hough Circle:
cv::HougCircles(src, circles, method, dp, min_dist, param1, param2, min_radius, max_radius)
Trong đó:
Src: là ảnh đầu vào có thể là ảnh nhị phân hoặc ảnh xám.
Circles: là vector chứa kết quả phát hiện đường tròn với 3 tham số a, b, R (toạ độ tâm và bán kính)
Method: là phương pháp phát hiện đương tròn (hiện tại phương pháp trong OpenCV là CV_HOUGH_GRADIENT)
dp: là tỉ số nghịch đảo của độ phân giải
min_dist: là khoảng cách nhỏ nhất giữa hai tâm đường tròn phát hiện được
param1, param2: là các thông số ngưỡng trên và ngưỡng dưới phục vụ cho việc phát hiện biên bằng phương pháp canny
min_radius và max_radius: là giới hạn nhỏ nhất, lớn nhất của bán kính đường tròn ta cần phát hiện(Nếu ta không set giá trị cho bán kính đặt giá trị  bán kính, để mặc định hai giá trị này bằng không thì chương trình sẽ lần tăng giá trị bán kính một cách tự động để tìm ra tất cả các đường tròn trong ảnh).

6.Các phép biến đổi hình thái học.

CV::RESIZE():
cv::resize() có tác dụng thay đổi kích thước hình ảnh, ta cung cấp đầu vào là 1 ảnh và kích thước đầu ra mong muốn.
resize(src, dst, size(), fx, fy, interpolation);
Trong đó:
src và dst: là ảnh đầu vào và đầu ra.
size(): kích thước mong muốn cảu ảnh đầu ra.
Fx,fy: tỷ lệ so với ảnh gốc ta muốn áp dụng cho trục fx ,fy.
Interpolation: phương pháp nội suy.

Biến đổi affine:

Cho một điểm (x, y) biến đổi Affine biến nó thành điểm (xt, yt)

Hay xt = ax + by +tx; yt = cx + dy +ty
Xét ma trân S khi b=c=tx=ty = 0, khi đó xt = ax, yt = by. Khi đó với các hệ số a,b nó sẽ phóng to hoặc thu nhỏ ảnh.
VD: a=b=2.

Nếu ta định nghĩa ma trận S =  thì phép biến sẽ quay p thành p’ với theta.

VD:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main(){
Mat src = imread(“book1.jpg”);
Mat dst = src.clone();

double angle = 45.0;
double scale = 1.5;

Point2f center(src.cols/2, src.rows/2);

    //tạo ma trận với tâm quay center, góc quay angle và tỉ lệ scale.
Mat mat_rot = getRotationMatrix2D(center,angle,scale);
warpAffine(src, dst, mat_rot, src.size());
imshow(“anh goc”, src);
imshow(“snh sau”, dst);
waitKey(0);

return 1;
}

7.Histogram

Histogram của một ảnh là một biểu đồ nói lên mối quan hệ giữa các giá trị của pixel ảnh (điểm ảnh) và tần suất xuất hiện của chúng. Nhìn vào biểu đồ histogram ta có thể đoán được một ảnh sáng tối như thế nào.
Nếu một ảnh có histogram lệch về phía phải biểu đồ, ta nói ảnh đó thừa sáng. Nếu lệch về phía trái thì ảnh đó thiếu sáng.

Hình trên mô tả histogram của một ảnh xám, ảnh này có histogram lệch về phía trái của biểu đồ và do đó ảnh này là khá tối. Đối với ảnh màu, ta có thể tính toán histogram cho từng kênh màu một. Sau đây là chương trình tính và vẽ biểu đồ histogram của một ảnh màu.
Đối với ảnh màu RGB ta có thể tách riêng từng kênh màu và tính toán histogram cho từng kênh
Cân bằng histogram (histogram equalization) là
phương pháp làm cho biểu đồ histogram của ảnh được phân bố một cách đồng đều. Đây là một biến đổi khá quan trọng giúp nâng cao chất lượng ảnh, thông thường đây là bước tiền xử lý của một ảnh đầu vào cho các bước tiếp theo.

8.Biến đổi Fourier trong xử lí ảnh.
Trong xử lí ảnh biến đổi Fourier biến đổi một hình ảnh trong miền không gian sang miền tần số và có những thao tác xử lí ảnh đó trên miền tần số rồi chuyển ngược lại ảnh trong miền không gian bằng biến đổi fourier ngược.


Khối thứ nhất là khối tiền xử lí tức là có những xử lí cơ bản trước khi thực hiện biến đổi fourier (ví dụ: chuyển mức xám, định kích cỡ, …). Khối thứ hai là khối biến đổi fourier, ảnh qua khối này được biến đổi fourier. Khối tiếp theo là là một bộ lọc trong miền tần số với đáp ứng xung là H(u,v). Khi ra khỏi bộ lọc H(u,v) ta thu được một ma trận H(u,v)F(u,v).
Nếu muốn xử dụng ảnh trong miền không gian ta sẽ thực hiện biến đổi fourier ngược, ảnh này sau khi được biến đổi fourier ngược sẽ được hậu sử lí (postprocessing) và thu được một ảnh g(x,y) gọi là ảnh tăng cường

Leave a Reply

Your email address will not be published. Required fields are marked *