Chuẩn hóa tinh thần Chuyển đổi sóng con D4 của tôi ở mỗi bước làm giảm chất lượng hình ảnh cuối cùng


7

Ảnh gốc:

ảnh gốc trước khi chuyển đổi và lọ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 doublecá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 minValToSurvivelà 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

d4 giảm 83% 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)

Giảm 90%, không bình thường hóa

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?

Câu trả lời:


3

Câu trả lời đúng là bạn phải thực hiện mỗi Update / Dự đoán bước trên tín hiệu đầu vào hoàn toàn trước khi thực hiện cập nhật tiếp theo / Dự đoán. Những gì tôi đang làm là đi qua tín hiệu và thực hiện mỗi Cập nhật / Dự đoán khi tôi đi.

Trên trang 158 của "Ripples", có một triển khai tham chiếu.

// s is the signal
#define IEVEN (2*j)
#define IODD (2*j + i)
for( int i = 1 ; i <= n/2 ; i *= 2 )
{
  for( int j = 0 ; j <= n/2 - i ; j += i ) // Must do this Predict step COMPLETLEY
    s[ IEVEN ] += √3 * s[ IODD ] ;

  for( int j = 0 ; j <= n/2 - i ; j += i ) // Then this one..
  {
    int prevEvenIndex = IPREVEVEN ;
    s[ IODD ] -= d4c1*s[ IEVEN ] + d4c2*SAFE_PREV(s,prevEvenIndex) ;
  }

  for( int j = 0 ; j <= n/2 - i ; j += i )
  {
    int nextOddIndex = INEXTODD ;
    s[ IEVEN ] -= SAFE_NEXT(s,nextOddIndex) ;
  }

  for( int j = 0 ; j <= n/2 - i ; j += i )
  {
    s[ IEVEN ] *= d4normEvens ;
    s[ IODD ] *= d4normOdds ;
  }
}

Biến đổi D4 98% 0:

d4 98%


Kudos cho đăng cập nhật về nghiên cứu của bạn! Trang web này chưa tập hợp được nhiều chuyên gia, vì vậy không phải câu hỏi nào cũng có thể được trả lời, nhưng thật tuyệt khi bạn quay lại và chia sẻ những phát hiện của mình. Tôi chắc chắn rằng nó sẽ hữu ích cho những người khác đang tìm kiếm thông tin tương tự.
Phonon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.