马赛克算法

工程中需要简单的马赛克算法模糊,看到网上的一些易读性不强,所以按自己的理解写了一个,调用了FreeImage的API,不过修改为直接操作BITMAP即可.

针对边界还没有完善,后面会再回头完善一下


	
        DWORD mosaic_size = 12; // 默认12
        auto w = FreeImage_GetWidth(dibMosaic);
        auto h = FreeImage_GetHeight(dibMosaic);
        
        DWORD max_grid_x = ceil(w * 1.0 / mosaic_size);
        DWORD max_grid_y = ceil(h * 1.0 / mosaic_size);
        DWORD max_grid_xy = max_grid_x * max_grid_y;
        DWORD* sum_r = new DWORD[max_grid_xy];
        DWORD* sum_g = new DWORD[max_grid_xy];
        DWORD* sum_b = new DWORD[max_grid_xy];
        DWORD* sum_a = new DWORD[max_grid_xy];


        memset(sum_r, 0, sizeof(DWORD)*max_grid_xy);
        memset(sum_g, 0, sizeof(DWORD)*max_grid_xy);
        memset(sum_b, 0, sizeof(DWORD)*max_grid_xy);
        memset(sum_b, 0, sizeof(DWORD)*max_grid_xy);


        for (auto y = 0; y < h; ++y) {
            for (auto x = 0; x < w; ++x) {
                RGBQUAD value;
                BOOL suc = FreeImage_GetPixelColor(dibMosaic, x, y, &value);
                ASSERT(suc);
                DWORD grid_xy_index = (y / mosaic_size) * max_grid_x + (x / mosaic_size);
                sum_r[grid_xy_index] += value.rgbRed;
                sum_g[grid_xy_index] += value.rgbGreen;
                sum_b[grid_xy_index] += value.rgbBlue;
                sum_a[grid_xy_index] += value.rgbReserved;
            }
        }
        BYTE* avg_r = new BYTE[max_grid_xy];
        BYTE* avg_g = new BYTE[max_grid_xy];
        BYTE* avg_b = new BYTE[max_grid_xy];
        BYTE* avg_a = new BYTE[max_grid_xy];
        int sum_matrix = (mosaic_size * mosaic_size);
        while (max_grid_xy--) {
            avg_r[max_grid_xy] = sum_r[max_grid_xy] / sum_matrix;
            avg_g[max_grid_xy] = sum_g[max_grid_xy] / sum_matrix;
            avg_b[max_grid_xy] = sum_b[max_grid_xy] / sum_matrix;
            avg_a[max_grid_xy] = sum_a[max_grid_xy] / sum_matrix;
        }


        for (auto y = 0; y < h; ++y) {
            for (auto x = 0; x < w; ++x) {
                DWORD grid_xy_index = (y / mosaic_size) * max_grid_x + (x / mosaic_size);
                RGBQUAD value = { avg_b[grid_xy_index],  avg_g[grid_xy_index],
                    avg_r[grid_xy_index],  avg_a[grid_xy_index] };
                //FreeImage_GetPixelColor(dibMosaic, x, y, &value);
                value.rgbBlue   = avg_b[grid_xy_index];
                value.rgbGreen  = avg_g[grid_xy_index];
                value.rgbRed    = avg_r[grid_xy_index];
                value.rgbReserved = avg_a[grid_xy_index];
                BOOL suc = FreeImage_SetPixelColor(dibMosaic, x, y, &value);               
            }
        }


        delete[] sum_r;
        delete[] sum_g;
        delete[] sum_b;
        delete[] sum_a;


        delete[] avg_r;
        delete[] avg_g;
        delete[] avg_b;
        delete[] avg_a;




你可能感兴趣的:(图像处理)