Ảnh gốc:
(Hình ảnh được bao gồm là hình ảnh .png, vì vậy không có biến dạng bổ sung nào được thêm vào trong lưu / tải lên để xem)
Tôi đã sử dụng phép biến đổi D4 từ trang 20 của "Ripples in math" , về cơ bản là 5 bước sau:
Chuyển tiếp d4:
c1 = √3 / 4.0 ;
c2 = (√3 - 2) / 4.0 ;
s[ IEVEN ] += √3 * s[ IODD ] ;
s[ IODD ] -= c1*s[ IEVEN ] + c2*s[ IPREVEVEN ] ;
s[ IEVEN ] -= s[ INEXTODD ] ;
s[ IEVEN ] *= ( √3 - 1 ) / √2 ;
s[ IODD ] *= ( √3 + 1 ) / √2 ;
Nghịch đảo:
c1 = √3 / 4.0 ;
c2 = (√3 - 2) / 4.0 ;
s[ IODD ] *= ( √3 - 1 ) / √2 ;
s[ IEVEN ] *= ( √3 + 1 ) / √2 ;
s[ IEVEN ] += s[INEXTODD] ;
s[ IODD ] += c1*s[ IEVEN ] + c2*s[IPREVEVEN] ;
s[ IEVEN ] -= √3 * s[ IODD ] ;
Tôi đang biên dịch và chạy nó bằng double
các giá trị chính xác từ C ++. Tôi chạy cái này trên các hàng của hình ảnh, sau đó là các cột. Tôi sử dụng thuật toán lọc thô để loại bỏ 90% hệ số chênh lệch thấp nhất trong ảnh.
Thuật toán lọc là:
- Chạy qua toàn bộ hình ảnh được chuyển đổi (dưới dạng một bộ số)
- Tìm hệ số chênh lệch lớn nhất (
maxVal
) (trong toàn bộ hình ảnh 2d) - Chọn
minValToSurvive
là 1% trong sốmaxVal
. - Nếu một hệ số chênh lệch có độ lớn nhỏ hơn
minValToSurvive
, nó bằng không.
Đây là vấn đề của tôi là. Khi tôi chỉ xóa 83% các hệ số chênh lệch thấp nhất khỏi hình ảnh (minValToSurvive = 0,01 * maxVal), bạn sẽ nhận được điều này:
bình thường hóa
Nếu tôi loại bỏ các bước chuẩn hóa:
s[ IEVEN ] *= ( √3 - 1 ) / √2 ; // REMOVE
s[ IODD ] *= ( √3 + 1 ) / √2 ;
(ở cả Fwd và biến đổi ngược lại), kết quả sau khi loại bỏ 90% các bộ phận là nhiều hơn (ít hơn nhiều tiếng ồn)
Vì vậy, tôi có thể nghĩ về 1 trong 2 vấn đề:
- Bình thường hóa hình ảnh theo các yếu tố (3 - 1) / 2 đang giết chết độ chính xác
- Tôi không lọc chính xác
Hoặc là tôi sai? Nếu tôi lọc (loại bỏ các thành phần không đáng kể) không chính xác, cách tốt hơn để lọc là gì? Nếu đó là độ chính xác của dấu phẩy động, thì tôi có nên bình thường hóa biến đổi ở mọi bước không?