Tính toán_ENTropy_Một_Chữ_Số_Và_Hai_Chữ_Số_Của_Hình_Ảnh_Xám_256_Gamma_Sử_Dụng_VC++

Bài Thí Nghiệm: Tính Entropy Một Chữ Số và Hai Chữ Số Của Hình Ảnh Xám 256 Gamma Sử Dụng VC++

1. Định Nghĩa Entropy Một Chữ Số

Entropy là một đặc trưng thống kê phản ánh lượng thông tin trung bình trong hình ảnh. Entropy một chữ số đo lường lượng thông tin mà phân phối mức xám của hình ảnh mang lại.

Công thức tính entropy một chữ số:

[ H_1 = - \sum_{i=0}^{L-1} p_i \cdot \log_2(p_i) ]

Trong đó, ( L ) là số mức xám, ( p_i ) là xác suất xuất hiện của mức xám ( i ).

2. Mã Thực Hiện Entropy Một Chữ Số Trong C++

double entropy_mot_chu_so = 0.0;
int chieu_dai = pDoc->m_pDibInit->GetHeight();
int chieu_rong = pDoc->m_pDibInit->GetWidth();
int so_luong_xam[256] = { 0 };

// Đếm số lượng điểm ảnh cho mỗi mức xám
for (int y = 0; y < chieu_dai; ++y) {
    for (int x = 0; x < chieu_rong; ++x) {
        int muc_xam = pDoc->m_pDibInit->GetPixelGray(y, x);
        so_luong_xam[muc_xam]++;
    }
}

// Chuyển số lượng thành xác suất và tính entropy
double xac_suat_xam[256] = { 0.0 };
for (int i = 0; i < 256; ++i) {
    xac_suat_xam[i] = static_cast<double>(so_luong_xam[i]) / (chieu_dai * chieu_rong);
    if (xac_suat_xam[i] > 0) {
        entropy_mot_chu_so -= xac_suat_xam[i] * log2(xac_suat_xam[i]);
    }
}

3. Định Nghĩa Entropy Hai Chữ Số

Entropy hai chữ số bổ sung thông tin về đặc trưng không gian của phân phối mức xám bằng cách sử dụng giá trị trung bình mức xám của các điểm lân cận làm đặc trưng phụ.

Công thức tính entropy hai chữ số:

[ H_2 = - \sum_{i=0}^{L-1} \sum_{j=0}^{L-1} p_{ij} \cdot \log_2(p_{ij}) ]

Trong đó, ( p_{ij} ) là xác suất của cặp đặc trưng (mức xám, giá trị trung bình mức xám).

4. Mã Thực Hiện Entropy Hai Chữ Số Trong C++

double entropy_hai_chu_so = 0.0;
int bang_tan_trung_binh[256][256] = { 0 };

// Tính giá trị trung bình mức xám của các điểm lân cận
for (int y = 0; y < chieu_dai; ++y) {
    for (int x = 0; x < chieu_rong; ++x) {
        int tong = 0, dem = 0;
        for (int ky = -1; ky <= 1; ++ky) {
            for (int kx = -1; kx <= 1; ++kx) {
                int ny = y + ky, nx = x + kx;
                if (ny >= 0 && ny < chieu_dai && nx >= 0 && nx < chieu_rong) {
                    tong += pDoc->m_pDibInit->GetPixelGray(ny, nx);
                    ++dem;
                }
            }
        }
        bang_tan_trung_binh[y][x] = tong / dem;
    }
}

int bang_tan_so[256][256] = { 0 };
double bang_xac_suat[256][256] = { 0.0 };

// Đếm số lượng cặp đặc trưng và chuyển thành xác suất
for (int y = 0; y < chieu_dai; ++y) {
    for (int x = 0; x < chieu_rong; ++x) {
        int muc_xam = pDoc->m_pDibInit->GetPixelGray(y, x);
        int tan_trung_binh = bang_tan_trung_binh[y][x];
        bang_tan_so[muc_xam][tan_trung_binh]++;
    }
}

for (int i = 0; i < 256; ++i) {
    for (int j = 0; j < 256; ++j) {
        bang_xac_suat[i][j] = static_cast<double>(bang_tan_so[i][j]) / (chieu_dai * chieu_rong);
        if (bang_xac_suat[i][j] > 0) {
            entropy_hai_chu_so -= bang_xac_suat[i][j] * log2(bang_xac_suat[i][j]);
        }
    }
}

CString thong_tin;
thong_tin.Format(_T("Entropy Một Chữ Số: %f, Entropy Hai Chữ Số: %f"), entropy_mot_chu_so, entropy_hai_chu_so);
MessageBox(thong_tin);

Thẻ: VC++ Entropy Hình Ảnh Xám mã hóa

Đăng vào ngày 16 tháng 6 lúc 01:44