马赛克算法
来源:互联网 发布:集合与数组的联系 编辑:程序博客网 时间:2024/04/30 08:53
工程中需要简单的马赛克算法模糊,看到网上的一些易读性不强,所以按自己的理解写了一个,调用了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;
阅读全文
0 0
- 马赛克算法
- 马赛克算法
- 图像放大算法(马赛克效果)
- 马赛克
- PS 滤镜算法原理 ——马赛克
- PS 滤镜算法原理 ——马赛克
- iOS中图片处理之马赛克算法
- PhotoShop算法实现高级篇--马赛克(三十八)
- Win8 Metro(C#)数字图像处理--2.43图像马赛克效果算法
- OpenCV,马赛克 常用图像增强算法的实现
- 马赛克问题
- 马赛克问题解决
- 马赛克问题
- IPTV 马赛克
- 马赛克效果
- 字符串马赛克
- 马赛克原理
- Canvas--马赛克
- 2.0剑指offer书籍的学习
- css3纵向滚屏翻页,支持键盘,鼠标操作
- 构造函数与析构函数的典型应用
- 最长上升序列(Lis)
- hdu-CaoHaha's staff
- 马赛克算法
- java面试题:字符串的反转
- 编程之美
- 指纹辨识不再安全?苹果安全处理器出现漏洞?
- springBoot接收date类型参数转换
- SSIS--如何在 ETL 项目中统一管理上百个 SSIS 包的日志和包配置框架
- PreferenceScreen使用
- HDU 6153 A Secret(扩展KMP算法)
- 浅析linux下的crond和crontab