Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
3 posters
Trang 1 trong tổng số 1 trang
Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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
3/ Bộ lọc Bilateral
4/ Bộ lọc FFT
5/ Bộ lọc. Sobel
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
- Bộ lọc Gaussian
2/ Bộ lọc MedianXé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
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- 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
Bộ lọc Gaussian
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.
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.
Đườ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à σ.
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
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ó
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
Biểu đồ phân bố Gaussian với phương sai σ= 1.25 của nhân 5x5
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
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
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.
Đườ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à σ.
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
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ó
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
Biểu đồ phân bố Gaussian với phương sai σ= 1.25 của nhân 5x5
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
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
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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:
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à:
Sau khi sắp xếp theo độ lớn tăng dần thì ta có:
Nên giá trị của điểm ảnh sau khi lọc trung vị là 43
Chập với nhân 5x5 của bộ lọc trung vị
Chập với nhân 7x7 của bộ lọc trung vị
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 :
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:
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à:
Sau khi sắp xếp theo độ lớn tăng dần thì ta có:
Nên giá trị của điểm ảnh sau khi lọc trung vị là 43
Chập với nhân 5x5 của bộ lọc trung vị
Chập với nhân 7x7 của bộ lọc trung vị
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- 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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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à :
Ả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ì :
Bộ lọc theo dải được định nghĩa tương tự :
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ì :
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 :
Với tiêu chuẩn hóa :
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 :
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ó :
Khi :
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:
Khi:
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.
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à :
Ả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ì :
Bộ lọc theo dải được định nghĩa tương tự :
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ì :
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 :
Với tiêu chuẩn hóa :
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 :
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ó :
Khi :
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:
Khi:
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.
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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:
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à :
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.
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.
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:
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à :
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.
- 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. - 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) - Tiến hành biến đổi Fourier rời rạc
- Biến đổi giá trị phức và giá trị thực sang dạng biên độ độ lớn
- 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..... - 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ả. - 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.
Ảnh kết quả của ảnh có chữ bị nghiêng
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- 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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
Phép biến đổi Cosin
Đ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);
}
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- 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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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
Cảm ơn anh
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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
Dòng 18 là dòng nào ?
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
Đ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)};
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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.
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
Vậy thì đường link em đưa không đúng rồi .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
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- 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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
À 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
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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- 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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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ở
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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......)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ở
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
Anh viết tiếp các bài học thuật về xử lý ảnh đi anh 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
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
Đ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.phamithi đã viết:Anh viết tiếp các bài học thuật về xử lý ảnh đi anh 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
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- 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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
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é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ó ạ
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
Re: Các bộ lọc_phép biến đổi ảnh trong xử lý ảnh
Vâng cũng hy vọng vậy 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
Similar topics
» Các cơ sở dữ liệu trong nhận dạng (Databases)
» Năm ngôn ngữ lập trình được sử dụng trong lập trình tiến hóa
» Độ tiên tiến của tri thức có trong diễn đàn
» Năm ngôn ngữ lập trình được sử dụng trong lập trình tiến hóa
» Độ tiên tiến của tri thức có trong diễn đàn
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết
|
|