OPENLAB-IMAGE PROCESSING
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

3 posters

Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Sat Aug 22, 2015 10:40 am

Có rất nhiều bộ lọc trong xử lý ảnh bởi vì vốn dĩ xử ảnh là là xử lý tín hiệu số:
    Bài viết này sẽ liệt kê các bộ lọc được dùng. Từng bộ lọc sẽ có tên tiếng Việt, tên Tiếng Anh, chức năng, và đường link tới bài viết về nó trong diễn đàn này. Sẽ có rất nhiều thiếu sót không mong muốn mà các bạn có thể bổ sung để có thể xây dựng lên một thống kê đầy đủ nhất, hiện đại nhât, hiệu quả nhất cho công việc xử lý ảnh. THống kê này luôn luôn được cập nhật những thông tin mới nhất, hữu ích nhất cho bạn.
#OPENCV


  1. Bộ lọc Gaussian

 Xét trên miền tần số thì bộ lọc Gaussian sẽ giảm thành phần tần số cao trong hình ảnh hay nói cách khách bộ lọc Gaussian là bộ lọc thông cao ( chỉ giữ lại thành phần tần số thấp).Trong toán học, việc ứng dụng Gaussian Blur cho một hình cũng chính là tính tích chập (Convolution) hình đó với hàm Gaussian.Một cách trực quan, đây được xem như là phương pháp làm mờ mịn cũng giống như hiệu ứng hình ảnh được đặt dưới một lớp màn trong suốt bị mờ. Nó không giống với trường hợp hình ảnh bị mờ do hậu quả của ống kính bị mất tiêu điểm (out of focus) hay do bóng của đối tượng dưới ánh sáng thường. Nó có thể giúp làm giảm nhiễu (Noise) và mức độ chi tiết (không mong muốn) của hình ảnh.
Nguồn trích dẫn: http://www.ieev.org/2009/06/gaussian-blur.html
2/ Bộ lọc Median
3/ Bộ lọc Bilateral
4/ Bộ lọc FFT
5/ Bộ lọc. Sobel


Được sửa bởi jackauk ngày Mon Sep 21, 2015 12:20 pm; sửa lần 3.
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Bộ lọc Gaussian

Bài gửi by jackauk Tue Aug 25, 2015 10:34 am

Xét trên miền tần số thì bộ lọc Gaussian sẽ loại bớt các thành phần có tần số cao và giữ là thành phần có tần số thấp. Dưới đây là phương trình hàm Gaussian dùng trong không gian một chiều và hai chiều.

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh D6b0acc2-ed84-4db9-9e89-ecc305c4cabf

Trong đó x và y là tọa độ theo hai trục đứng và ngang còn σ là phương sai
chuẩn của phân bố Gaussian hay là giá trị quyết định độ lệch giữa các điểm trên bề mặt Gaussian.Trong phân bố Gaussian chuẩn thì giá trị kỳ vọng μ =0.

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh GaussianDitribution

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh GaussianKernel

Đường cong Gauss chuẩn hóa với giá trị kỳ vọng μ =0 và phương sai σ2 =0.2 cho mảng 2 chiều ( ảnh) ;  Khoảng tập trung của phân bố trong khoảng(-1.341,1.341) là 99.7%
       Giá trị mới của mỗi Pixel sau khi tính tích chập với nhân đại diện cho hàm Gaussian có thể coi là trung bình lượng giá trị của các pixel xung quanh nó. Ta thấy rằng giá trị lượng giá của phần tử trung tâm kernel tương ứng với pixel đang xét là lớn nhất, giá trị này sẽ nhỏ hơn đối với các phần tử tương ứng với những pixel kế cận một cách đối xứng và tỉ lệ thuận với khoảng cách của phần
tử này với trung tâm. Tính chất này giúp giữ lại đường viền và biên cũng như làm mờ một cách đồng bộ hơn so với các phương pháp khác
Trong lý thuyết, hàm Gaussian tại mỗi điểm trên hình là khác 0. Điều này có nghĩa là Gaussian Kernel nên có kích thước bằng với hình ảnh và giá trị tại mỗi phần tử luôn khác 0. Tuy nhiên trong thực hành, do việc tính tóan dựa trên xấp xỉ rời rạc (Discrete Approximation) cho nên giá trị của các phần tử trên bề mặt Gaussian , tập trung  trong khoảng 3 σ quanh tâm phân phối chuẩn chiếm 99.7% ở khoảngg cách lớn hơn 3σ so với trung tâm gần như không đáng kể (tiệm cận 0). Do vậy các phân tán Gaussian ngòai bán kính này sẽ bị bỏ qua, đó cũng là lý do mà thông thường Gaussian kernel có kích thước giới hạn 3, 5, 7... tùy vào giá trị phương sai chuẩn được chọn. Khoảng cách giữa hai điểm gần nhau trong Gaussian Kernel là σ.
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh GaussianDistribution

Với nhân 3x3 phương sai σ được openCv tính là 0.95

Biểu đồ phân bố Gaussian với phương sai σ= 0.95 của nhân 3x3

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh D9dd1aa0-90e7-4824-9d94-8e386aed7774

Ma trận Gaussian 3x3 (đã được làm tròn theo hình thưc phân số) và dạng chuẩn hóa của nó


Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Ada0c34e-47ef-4d6c-9b21-115779ff84bd


 Kết quả của làm mượt ảnh bằng bộ lọc Gaussian với nhân 3x3 phương sai σ= 0.95
Với nhân 5x5 phương sai σ được openCv tính là 1.25
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh GaussianDistribution2
Biểu đồ phân bố Gaussian với phương sai σ= 1.25 của nhân 5x5

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Originalkernel
Sau khi chuẩn hóa với số tỷ lệ là 2.116367 ta được  ma trận 5x5 đã được chuẩn hóa

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Normalizekernel

Kết quả của làm mượt ảnh bằng bộ lọc Gaussian với nhân 5x5 phương sai σ= 1.25

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh 91a41287-5ec2-45fa-9eb3-0a846ce80ae8
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Mon Aug 31, 2015 5:29 pm

Bộ lọc Median

Lọc Median hay còn gọi là lọc trung vị khác với bộ lọc trung bình ở chỗ nó không xảy ra bất cứ phép tính toán gì, nó chỉ đơn giản là chỉ ra đâu là giá trí nằm ở vị trí trung bình trong các giá trị đầu vào được thiết lập bởi khung lọc rồi lấy giá trị đó thế vào tâm của khung lọc trong ảnh gốc để tạo ra giá trị ảnh mới. Hiệu quả của phép lọc có khí không rõ ràng, khó có thể nhận ra được sự thật đằng sau phép biến đổi vì nó chỉ thay đổi một số điểm ảnh thôi chứ không phải toàn bộ các điểm ảnh nhưng nó có ưu thế là sự sửa chữa mạnh mẽ một số điểm bất thường trên ảnh mà các bộ lọc khác không làm được hoặc dễ dàng bỏ qua.

Với nhân chập 3x3 thì với một tập điểm ảnh như sau:

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh ConvolutionDemonstration

Giả sử vùng dữ liệu ảnh hiện có như trên thì khi sử dụng nhân 3x3 của lọc trung vị ta có các giá trị của nhân là:

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Dataset

Sau khi sắp xếp theo độ lớn tăng dần thì ta có:

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Arrangeddataset

Nên giá trị của điểm ảnh sau khi lọc trung vị là 43

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Median5x5
Chập với nhân 5x5 của bộ lọc trung vị

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Median7x7
Chập với nhân 7x7 của bộ lọc trung vị

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Median9x9
Chập với nhân 9x9 của bộ lọc trung vị

Code OPENCV 2.1:
IplImage* result =cvCreateImage(cvGetSize(currentImage),8,3) ;
// cvCopy(currentImage,result);
// cvZero(result);
cvSmooth(currentImage,result,CV_MEDIAN);
cvShowImage("result",result);
MessageBox::Show("Smooth");
cvReleaseImage(&result);

Code OPENCV 3.0:
cv::Mat temp = cv::cvarrToMat(currentImage);
cv::Mat results; cv::medianBlur(temp,results,9);
cv::imshow("results",results);

Code Matlab :


Được sửa bởi jackauk ngày Sat Sep 19, 2015 4:18 pm; sửa lần 3.
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Sun Sep 06, 2015 12:21 am

Bộ lọc Bilateral ( Bộ lọc hai chiều): CV_BILATETAL
Bộ lọc hai chiều làm mượt ảnh trong khi vẫn bảo toàn được cạnh, bằng cách kết hợp không tuyến tính của cá giá trị ảnh gần nhau. Phương thức này không lặp, cục bộ và đơn giản. Nó kết hợp các mức xám hay màu sắc dựa trên sự thân cận hình học của chúng và sự gần giống về độ sáng của chúng. Ngược với các bộ lọc hoạt động trên 3 dải màu riêng rẽ, bộ lọc hai chiều có  thể thi hành việc đo đạc có chủ đích với không gian màu CIE-Lab,và làm mượt màu và bảo toàn cạnh theo cái cách phù hợp với nhận thức của con người. Hơn nữa, khác với phép lọc chuẩn, bộ lọc hai chiều không tạo ra các bóng mờ  của màu dọc theo các cạnh của ảnh màu, và giảm đi bóng mờ của màu xuất hiện trên ảnh gốc.
Nếu 3 kênh của ảnh màu được lọc riêng rẽ với nhau thì các màu sắc bị sai lệch gần với các biên của ảnh. Bởi thực tế, các kênh màu khác nhau có các mức tương phản khác nhau nên nó được lọc khác nhau. Việc làm mượt riêng lẻ sẽ làm xáo trộn sự cân bằng của màu sắc, xuất hiện những màu sắc kết được kết hợp không mong muốn. Bộ lọc hai chiều,  có thể thực thi với 3 kênh màu cùng 1 lúc nên có thể nói thẳng là màu vừa tương tự vừa không tương tự. Chỉ những màu phù hợp nhận thức thì bằng trung bình của các màu khác , và các màu không phù hợp thì bị loại bỏ. Bộ lọc hai chiều xét đến cả dải màu của ảnh trong khi các bộ lọc truyền thống chỉ xét từng miền ảnh. Hai pixel có thể được coi như là gần  với một pixel khác, điều đó phụ thuộc vào vị trí không gian gần nhau, hay chúng có thể  tương tự với một pixel khác, điều đó được hiểu là xấp xỉ về giá trị.  Bộ lọc hai chiều vừa có thể quân bình nhiễu trên vùng ảnh vừa có thể giữ lại đường viền của miền không bị quân bình.
Coi bộ lọc không dịch _biến đổi cho mức thấp qua áp dụng cho ảnh là :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular1
Ảnh đầu vào và đầu ra đều có thể là nhiều kênh. Để giữ lại thành phần hằng số d,  thì :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular2
Bộ lọc theo dải được định nghĩa tương tự :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular3
Trong trường hợp này nhân để đo sáng tương tự nhân để đo khoảng cách giữa pixel. Hằng số được chuẩn hóa trong trường hợp này thì :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular4
Sự phân bố không gian của cường độ ảnh không đóng vai trò trong bộ lọc theo dải màu mà được nhận từ chính nó. Kết hợp các mức cường độ từ toàn thể bức ảnh, tuy nhiên có thể tạo nên chút ý nghĩa khi mà sự phân bố của giá trị ảnh xa giá trị x không có khả năng ảnh hưởng đến giá trị sau cùng của x. Thêm nữa, điều này có thể chỉ ra rằng bộ lọc theo dải mà không có bộ lọc theo miền thì đơn thuần chỉ là thay đổi bản đồ màu của bức ảnh và do đó nó ít được dùng.Giải pháp thích hợp là kết hợp cả bộ lọc theo dải màu và theo miền ảnh, bằng cách ấy có thể gắn kết được cả phép đo theo hình học và đo sáng vị trí. Sự kết hợp này được mô tả như sau :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular5
Với  tiêu chuẩn hóa :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular6
Kết hợp bộ lọc theo miền và bộ lọc theo dải được gọi là bộ lọc hai chiều. Nó thay thế  gái trị pixel tại điểm x với giá trị trung bình của các điểm tương tự và gần với giá trị pixel. Trong miền làm mượt, giá trị pixel trong một khoảng lân cận nhỏ thì tương tự với các điểm khác, và bộ lọc hai chiều hoạt động chủ yếu như một lọc theo miền tiêu chuẩn, bình quân các sự khác biệt nhỏ, yếu tương quan giữa các giá trị pixel gây ra bởi nhiễu. Bây giờ xét tới một biên dạng hình thể giữ hai vùng sáng tối như hình sau :
 Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Bilateral
Hình 1

Ở bộ lọc hai chiều, những pixel nếu nằm ở bên sáng của đường biên thì có giá trị gần với pixel cùng bên sáng và gần với gái trị 0 khi pixel nằm bên tối. Hàm tương tự được thể hiện ở ảnh 1b cho bộ lọc 23x23 tâm ở 2 điểm . Chuẩn hóa điều kiện k(x) bảo đảm cho tổng cho tất cả các pixel được cộng thêm 1. Với kết quả, bộ lọc thay  pixel sáng tại tâm đang xử lý lọc bằng một giá trị trung bình của cac pixel sáng lân cận của nó, và quan trong là loại bỏ pixel tối. Điều ngược lại, khi tâm của bộ lọc nằm ở pixel tối, pixel sáng bị bỏ qua. Vì vậy, như ở hình 1, mặt tốt của bộ lọc được thể hiện ở các vùng biên
Với trường hợp bộ lọc hai chiều với phân phối Gaussian ta có :
  Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular7
Khi :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular8
Là khoảng các trong không gian Euclid. Hàm tương tự thì tương đồng hoàn toàn với c:
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular9
Khi:
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Formular10
Là đơn vi đo thích hợp cho khoảng cách trong không gian. Trong trường hợp sử dụng tỷ lệ phóng, nó làm đơn giản quá trình tìm trị tuyệt đối chênh lệch giữa các pixel khác nhau, khi tăng cường nhiễu với cường độ ảnh, thì sẽ tăng cượng độ phụ thuộc vào nó.
Bộ lọc hai chiều trong OpenCV sử dụng tham số CV_BILATERAL cho mode, kích thước của nhân là
param1x param 1,  (color sigma_độ lệch màu sắc) =param4, ( spatial sigma_độ lệch không gian) =param3.
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh ResultBiltateral
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Thu Sep 17, 2015 12:57 am

Bộ lọc hay phép biến đổi Fourier nhanh (Fast Fourier Transform -FFT)
 Một biến đổi Fourier nhanh (FFT) là một thuật toán hiệu quả để tính biến đổi Fourier rời rạc (DFT) và biến đổi ngược. Có nhiều thuật toán FFT khác nhau sử dụng kiến thức từ nhiều mảng khác nhau của toán học, từ số phức tới lý thuyết nhóm và lý thuyết số.
 Phép biến đổi DFT phân tích một dãy các số thành các thành phần ở các tần số khác nhau. Nó được sử dụng trong nhiều lĩnh vực khác nhau (xem các tính chất và ứng dụng ở biến đổi Fourier rời rạc) nhưng tính toán trực tiếp từ định nghĩa thường quá chậm trong thực tế. FFT là một cách để đạt được cùng kết quả đó nhưng nhanh hơn nhiều: tính DFT của N điểm trực tiếp theo định nghĩa đòi hỏi O(N2) phép tính, trong khi FFT tính ra cùng kết quả đó trong O(N log N) phép tính.
Giả sử x0, x1,..., xn là các số phức. DFT được định nghĩa bởi công thức sau:

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Fomular

Tính trực tiếp từ định nghĩa trên đòi hỏi O(N2) phép tính: có N số Xk cần tính, để tính mỗi số cần tính một tổng N số hạng. Một FFT là một phương pháp để tính cùng kết quả đó trong O(N log N) phép tính.
Ứng dụng của phép biến đổi này trong xứ lý ảnh là phân tích bức ảnh thay vì dưới dạng không gian 2 chiều của các điểm ảnh có giá trị cường độ sáng thành một miền một chiều theo tần số gọi là phân tích phổ.
Để biết rõ hơn các bạn nên tham khảo về nó trên internet bởi vì riêng kiến thức về nó thôi đã trở thành một ngành khoa học rồi. Trong khuôn khổ chủ đề này mình chỉ muốn giới thiệu ứng dụng của nó để các bạn có thể lựa chọn phương pháp lọc cùa mình cho phù hợp với yêu cầu.


Biến đổi Fourier sẽ phân tích một bức ảnh thành hai thành phần cos và sin. Nói cách khác, nó biến đổi ảnh từ miền không gian sang miền tần số. Ý tưởng là có một hàm nào đó có thể xấp xỉ một cách chính xác với tổng vô hạn của hàm sin và cos. Biến đổi Fourier là cách để làm điều đó. Dạng toán học của biến đổi Fourier ảnh hai chiều là :
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Fomular2
f ở đây là giá trị ảnh trong miền không gian và F là giá trị ảnh trong miền tần số. Kết quả của phép biến đổi là tập số phức. Điều này có thể biểu diễn thông qua một ảnh thực và một ảnh phức hay thông qua độ lớn và một ảnh pha. Tuy nhiên qua thuật toán biến đổi ảnh thì chỉ có ảnh biên độ mới có giá trị bởi nó chứa tất cả thông tin về các cấu trúc hình học của ảnh. Tuy vậy, nếu bạn có dự định làm điều gì đó với ảnh biên độ ( cường độ độ lớn) và biến đổi ngược lại về miền không gian thì bạn cần cả hai thành phần ảnh  biên độ và pha (magnitude và phase).
Trong ví dụ sau đây chúng tôi sẽ chỉ cách tính toán và hiển thị ảnh cường độ của phép biến đổi Fourier. Trong trường hợp ảnh số là rời rạc. Có nghĩa là chúng được hiểu là giá trị từ miền giá trị nhận được. Ví dụ là một ảnh xám thường có giá trị điểm ảnh nằm trong khoảng từ 0 đến 255. Do đó phép biến đổi Fourier cần những giá trị kết quả rời rạc. Bạn sẽ muốn sử dụng nó bất cứ khi nào bạn cần xác định cấu trúc của bức ảnh từ tất cả các cấu trúc hình học nào trong tầm mắt. Sau đây là các bước cần thiết cho một ảnh xám đầu vào.

  1. Mở rộng ảnh đến một kích thước tối ưu.
     Phép biến đổi Fourier đạt trạng thái nhanh nhất khi kích thước ảnh là bộ số của 2,3 5.
  2. Tạo nơi chứa cho giá trị phức và giá trị thực
    Lưu ý rằng phép biến đổi kết quả sẽ rất là lẻ, cần nhiều con số để biểu diễn nên lưu trữ chúng dưới dạng float ( CV_32F) chứ không phải kiểu int hay char như ảnh gốc ( 0-255)
  3. Tiến hành biến đổi Fourier rời rạc

  4. Biến đổi giá trị phức và giá trị thực sang dạng biên độ độ lớn
    Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Magnitude
  5. Biểu diễn dưới dạng logarit
    Do kết quả tính toán vượt giá trị có thể biểu diễn điểm ảnh của màn hình cho nên phải hạ tỷ lệ nó theo logarit cơ số 10. Ví dụ log100 =2, log1000=3.....
  6. Cắt tỉa hình và sắp xếp lại
    Do bước đầu tiên ta giãn ra thì phải co lại theo tỷ lệ gốc để có thể hiển thị được kết quả.
  7. CHuẩn hóa
    Vì mục đích dễ mường tượng kết quả phải chuẩn hóa nó về dạng ảnh xám ý nghĩa là giống như trên một bức ảnh ta có tất cả đều là màu đỏ nhưng mà có cái đỏ đậm có cái đỏ nhạt, có cái phơn phớt ta giãn nó ra thành màu xám màu xanh màu đỏ màu vàng.... thì dễ phân biệt được các màu với nhau.


Code sau là viết với OpenCV 2.4.9 ( các bạn sẽ thấy làm việc với ảnh như một mảng số của Matlab)

1 #include "opencv2/core/core.hpp"
2 #include "opencv2/imgproc/imgproc.hpp"
3 #include "opencv2/highgui/highgui.hpp"
4 #include <iostream>
5 int main(int argc, char ** argv)
6 {
7 const char* filename = argc >=2 ? argv[1] : "lena.jpg";
8
9   Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
10 if( I.empty())
11 return -1;
12
13 Mat padded; //expand input image to optimal size
14 int m = getOptimalDFTSize( I.rows );
15 int n = getOptimalDFTSize( I.cols ); // on the border add zero values
16 copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));
17
18 Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
19 Mat complexI;
20 merge(planes, 2, complexI); // Add to the expanded another plane with zeros
21
22 dft(complexI, complexI); // this way the result may fit in the source matrix
23
24 // compute the magnitude and switch to logarithmic scale
25 // => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
26 split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
27 magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
28 Mat magI = planes[0];
29
30 magI += Scalar::all(1); // switch to logarithmic scale
31 log(magI, magI);
32
33 // crop the spectrum, if it has an odd number of rows or columns
34 magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2));
35
36 // rearrange the quadrants of Fourier image so that the origin is at the image center
37 int cx = magI.cols/2;
38 int cy = magI.rows/2;
39
40 Mat q0(magI, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant
41 Mat q1(magI, Rect(cx, 0, cx, cy)); // Top-Right
42 Mat q2(magI, Rect(0, cy, cx, cy)); // Bottom-Left
43 Mat q3(magI, Rect(cx, cy, cx, cy)); // Bottom-Right
44
45 Mat tmp; // swap quadrants (Top-Left with Bottom-Right)
46 q0.copyTo(tmp);
47 q3.copyTo(q0);
48 tmp.copyTo(q3);
49
50 q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left)
51 q2.copyTo(q1);
52 tmp.copyTo(q2);
53
54 normalize(magI, magI, 0, 1, CV_MINMAX); // Transform the matrix with float values into a
55 // viewable image form (float between values 0 and 1).
56
57 imshow("Input Image" , I ); // Show the result
58 imshow("spectrum magnitude", magI);
59 waitKey();
60
61 return 0;
62 }

Mình nhắc lại là ta không chắc kết quả của quá trình của biến đổi ảnh khi mà ta không thử trước. Công việc xử lý ảnh không phải là công việc ngày một ngày hai mà là quan trọng là kinh nghiệm của người lập trình trải qua nhiều lần thử nghiệm các phép lọc, phép biến đổi khác nhau. Nhiều phép biến đổi lạ lẫm ta phải thử đi thử lại để đạt được kết quả mong muốn. Có phép biến đổi hợp lý có phép biến đổi chả ra kết quả gì. Ở đây phép biến đổi DFT cho ta cấu trúc hình học chủ yếu của ảnh. Hai ảnh dưới đây cho ta mường tượng hiệu quả của phép biến đổi DFT như thế nào.

Ảnh kết quả của chữ in thẳng.
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Result_normal
Ảnh kết quả của ảnh có chữ bị nghiêng
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Result_rotated
Sau đó, việc còn lại là ta sẽ dùng các phép lọc, phép biến đổi khác để nhận ra được kết quả mong muốn. 

Hiệu quả của phép biến đổi, xem video sau để rõ hơn:


Được sửa bởi jackauk ngày Wed Sep 23, 2015 12:24 pm; sửa lần 2.
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Mon Sep 21, 2015 4:28 pm

Phép biến đổi Cosin
Jürgen Brauer đã viết:   Biến đổi Fourier rời rạc (DFT) và Biến đổi Cosine rời rạc(DCT) đều biểu diễn những chức năng tương tự: chúng đều phân tích vetor rời rạc theo thời gian, có chiều dài giới hạn thành tổng những hàm dịch và tỷ lệ. Cái khác biệt giữa chúng là kiểu của những hàm được sử dụng bởi mỗi phép biến đổil DFT sử dụng tập hợp các hàm lũy thừa phức điều hòa, trong khi đó DCT chỉ sử dụng những hàm cosine( giá trị thực).
    DFT được sử dụng rộng rãi trong các việc tạo nên những ứng dụng phân tích phổ để tìm vai trò của chúng trong dải tần số. Nó cũng được sử dùng như là khối kỹ thuật cho việc phân tích những đặc tính khi biểu diễn tín hiệu trên miền tần số, như các thuật toán chập nhanh có ghi chồng và lưu chồng.
    DCT thường được sử dụng trong các ứng dụng nén giảm dữ liệu như là định dạng ảnh JPEG. Thuộc tính của DCT hơi thích hợp cho việc nén được nhìn nhận là cấp cao của việc nén phổ, đạt hiệu quả cao; Việc biểu diễn tín hiệu của DCT hướng tới việc có nhiều năng lượng (hiệu suất) tập trung ở một số nhỏ những hệ số khi so sánh các phép biến đổi khác như DFT. Đây là điều được mong đợi cho một thuật toán nén ảnh; nếu bạn có biểu diễn xấp xỉ  tín hiệu ảnh gốc ( trên miền thời gian, không gian) sử dụng một tập hợp nhỏ những hệ số DCT có liên quan. sau đó bạn có thể giảm kích thước đòi hỏi cho vùng lưu trữ dữ liệu bằng cách chỉ lưu trữ những đầu ra của phép biến đổi DCT chứ một số lượng năng lượng quan trọng

Đoạn code dưới đây mô tả việc biến đổi ảnh bằng DCT và sau đó biến đổi ngược lại bằng Inverse DCT sau khi đã làm mất mát đôi chút dữ liệu không cần quan trọng để ý ở đoạn  at<double>(y,x)=0.0;







   IplImage* grays =cvCreateImage(cvGetSize(currentImage),8,1) ;

cvCvtColor(currentImage,grays,CV_RGB2GRAY);

cv::Mat img = cv::cvarrToMat(grays);// nếu là Mat rồi thì không cần chuyển đổi

cv::Mat img2;

int w = img.cols%2?img.cols+1:img.cols;

int h =img.rows%2?img.rows+1:img.rows;

cv::copyMakeBorder(img, img2, 0, h-img.rows, 0, w-img.cols, IPL_BORDER_REPLICATE);

 // DCT chỉ hoạt động với ma trận có kích thước dài và rộng là số chẵn nên ta phải canh chỉnh trước

// Grayscale image is 8bits per pixel,

// but dct() method wants float values!

cv::Mat img3 = cv::Mat( img2.rows, img2.cols, CV_64F);

img2.convertTo(img3, CV_64F);
// Tất nhiên là ảnh phải phải chuyển đổi từ dạng nguyên 8 bit sang dạng số thực để tính toán
 

// Let's do the DCT now: image => frequencies

cv::Mat freq;

cv::dct(img3, freq);

 

cv::imshow("Result",freq);

 

for (int Start=100; Start>0; Start-=1)

{

    // Set some frequencies to 0

    for (int y=Start; y<freq.rows; y++)

    {

        for (int x=Start; x<freq.cols; x++)

        {

            freq.at<double>(y,x) = 0.0;

        }

    }

 
    // Do inverse DCT: (some low) frequencies => image

    cv::Mat dst;

    cv::idct(freq, dst);

     char txt[100];

    sprintf(txt, "%04d", Start);

    cv::putText( dst, txt, cv::Point(10,20),  CV_FONT_HERSHEY_SIMPLEX, 0.5, CV_RGB(0,0,0) );

      cv::Mat idst = cv::Mat( dst.rows, dst.cols, CV_8U);

dst.convertTo(idst, CV_8U);
//Phải chuyển đổi về dạng 8bit mới có thể biểu diễn ảnh lên được

cv::imshow("Result in inverse mode",idst);

cv::waitKey(5);

}
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Thu Mar 24, 2016 8:38 pm

Anh ơi cho em hỏi đoạn code demo đầu tiên của anh em cop về chạy thử thì chương trình chạy bị lỗi, khi debug thì đến dòng lệnh thứ 18 VC2015 báo "Unhandled exception at 0x000007FEFD91965D in Project1.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000000011EB70". Em dùng opencv 3.1, do mới bước đầu học sử dụng nên còn gà quá, mong anh chỉ giúp
Cảm ơn anh Smile

phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Mon Mar 28, 2016 2:49 pm

phamithi đã viết:Anh ơi cho em hỏi đoạn code demo đầu tiên của anh em cop về chạy thử thì chương trình chạy bị lỗi, khi debug thì đến dòng lệnh thứ 18 VC2015 báo "Unhandled exception at 0x000007FEFD91965D in Project1.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000000011EB70". Em dùng opencv 3.1, do mới bước đầu học sử dụng nên còn gà quá, mong anh chỉ giúp
Cảm ơn anh Smile

Dòng 18 là dòng nào ?
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Mon Mar 28, 2016 5:26 pm

Đoạn code đầu tiên, Em chạy đến dòng này là bị báo lỗi như trên ạ
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};

phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by Admin Tue Mar 29, 2016 2:03 pm

phamithi đã viết:Đoạn code đầu tiên, Em chạy đến dòng này là bị báo lỗi như trên ạ
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};


Dòng này dùng để khởi tạo 1 mảng gồm 2 phần tử là 2 cấu trúc Mat, với Mat thứ nhất là ảnh gốc đã được canh lề, ảnh 2 là một cái cấu trúc Mat các phần tử bằng 0.
Thường thường nó báo lỗi dòng đó nhưng thật sự là dòng trước hoặc sau nó bị lỗi. Em in ra màn hình hoặc vẽ ra bức ảnh , kiểm tra chiều rộng, cao , số chiều của nó có khớp nhau không. Để tối nay anh kiểm tra lại code, vì code này anh lấy của người ta nhưng đã chạy ngon rồi.
Admin
Admin
Admin

Tổng số bài gửi : 17
Điểm danh tiếng : 0
Join date : 16/08/2015

https://openlab.forumvi.com

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Tue Mar 29, 2016 6:51 pm

Do dòng code ở trên e không dùng argv mà dùng lệnh imread và add link trực tiếp vào luôn thì ko chạy. nhưng dùng argv và phải chạy qua file exe thì mới được chứ em không chạy trực tiếp từ chương trình được ạ. Anh xem và chỉ giúp em với nguyên nhân là do đâu? Em cảm ơn Smile

phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Tue Mar 29, 2016 9:56 pm

phamithi đã viết:Do dòng code ở trên e không dùng argv mà dùng lệnh imread và add link trực tiếp vào luôn thì ko chạy. nhưng dùng argv và phải chạy qua file exe thì mới được chứ em không chạy trực tiếp từ chương trình được ạ. Anh xem và chỉ giúp em với nguyên nhân là do đâu? Em cảm ơn Smile
Vậy thì đường link em đưa không đúng rồi .
Ví dụ link đúng : "D://anh//191.jpg" 2 dấu // thay vì 1 dấu / nhé
Có thể chấp nhận đường link như sau "D:\anh\191.jpg" dấu \ ngược chiều so với dấu / . Lý do là trong lập trình mã unicode của 1 string thì ký tự \ có thể khởi đầu cho 1 mã unicode đặc biệt ví dụ như \0 là ký tự rỗng \r là ký tự xuống dòng \n là ký tự thụt vào 1 ký tự khi xuống dòng mới.
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Wed Mar 30, 2016 12:21 pm

À em biết nguyên nhân lỗi do e imread hình vào ở mode color thay vì grayscale như code của anh thì nó chạy được. Vậy cho em hỏi thêm nếu với ảnh màu thì có thể biểu diễn được ko ạ và làm như thế nào Smile


phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Thu Mar 31, 2016 2:12 pm

Việc xử lý DFT hay DCT đều xử lý trên miền đơn giá trị thôi nghĩa là nghĩa là ảnh xám, còn khi muốn áp dụng cho ảnh màu thì phải chia ra làm 3 lần xử lý cho 3 màu. Mà thông thường các phép biến đổi áp dụng cho ảnh xám thôi muốn xử lý ảnh màu thì làm 3 lần
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Thu Mar 31, 2016 2:27 pm

Em cảm ơn anh. A có thể viết 1 bài viết hoặc giải thích giúp em về thuật tóan histogram of gradient được không ạ. E xem paper về nó thì e ko hiểu cách tính normalization block ntn. Chắc do tiếng anh dở Sad

phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Fri Apr 01, 2016 8:39 am

phamithi đã viết:Em cảm ơn anh. A có thể viết 1 bài viết hoặc giải thích giúp em về thuật tóan histogram of gradient được không ạ. E xem paper về nó thì e ko hiểu cách tính normalization block ntn. Chắc do tiếng anh dở Sad
Việc chuẩn hóa của một ma trận hơi bị khoai đấy nó liên quan đến toán A2, nếu em đọc kỹ lại toán A2 rồi dịch các từ Tiếng Anh chuyên ngành ra tiếng việt sẽ dễ hiểu hơn (ma trận chéo trên, chéo dưới, khả nghịch, ma trận nghich đảo......)
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Fri Apr 01, 2016 9:22 am

Anh viết tiếp các bài học thuật về xử lý ảnh đi anh Smile em thấy VN có ít thông tin về nó quá,page này em thấy a viết khá tường tận và lĩnh vực cũng chuyên sâu nhưng lâu rồi không thấy post bài nữa Sad

phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Sat Apr 02, 2016 10:46 am

phamithi đã viết:Anh viết tiếp các bài học thuật về xử lý ảnh đi anh Smile em thấy VN có ít thông tin về nó quá,page này em thấy a viết khá tường tận và lĩnh vực cũng chuyên sâu nhưng lâu rồi không thấy post bài nữa Sad
Đi làm tối ngày nên không có thời gian rảnh để làm. Có mấy đứa đàn em sinh viên nhưng mà chúng cũng chả mê món này nên cứ để từ từ có thời gian thì viết tiếp.
Nếu em có hứng thú với những thứ này em tìm nguồn từ trang face-rec.org hoặc trang chủ của opencv . Em có thể liên hệ với em Luân cũng ở trong diễn đàn này, em ấy đang có ý định dịch document của openCV3.1 đấy. Anh có thể bảo nó liên hệ với em nếu em để thông tin liên lạc lại đây
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Mon Apr 04, 2016 2:17 pm

Em tên Thiện, email thienpm92@gmail.com. Em mới bước đầu làm quen với XLA nên dùng opencv để tìm hiểu nhanh các cách thức mà thuật toán nó chạy như thế nào. Còn chủ yếu công việc của em là đi sâu vào nghiên cứu và tối ưu các pp xử lý ảnh hiện có ạ

phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by jackauk Mon Apr 04, 2016 2:27 pm

phamithi đã viết:Em tên Thiện, email thienpm92@gmail.com. Em mới bước đầu làm quen với XLA nên dùng opencv để tìm hiểu nhanh các cách thức mà thuật toán nó chạy như thế  nào. Còn chủ yếu công việc của em là đi sâu vào nghiên cứu và tối ưu các pp xử lý ảnh hiện có ạ
Anh thấy trên facebook của em đề là đang nghiên cứu ở Hàn, nếu em có hướng đi nào mới, phương pháp nào mới có thể chia sẻ được thì chia sẻ nhé
jackauk
jackauk
Thành viên thường

Tổng số bài gửi : 63
Điểm danh tiếng : 2
Join date : 16/08/2015
Age : 35
Đến từ : TP Hồ Chí Minh

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by phamithi Mon Apr 04, 2016 2:31 pm

Vâng cũng hy vọng vậy Smile nhưng e mới vào thôi nên còn nhiều cái chưa biết mong anh chỉ giáo thêm qua các bài post

phamithi
Thành viên thường

Tổng số bài gửi : 8
Điểm danh tiếng : 0
Join date : 24/03/2016

Về Đầu Trang Go down

Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh Empty Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh

Bài gửi by Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết