与锐化相反,柔化是使图片看起来更柔滑(其实也是模糊的委婉的说法)。柔化的一个最简单的实现算法就是取图片上的每一点(图片边缘点忽略),计算它周围八个点的平均值作为新像素值。想想也是,之所以看起来模糊,确实是因为周围的点长的有点像,区别不太明显。

        // ============================柔化==============================
        /**//// <summary>
        /// 柔化
        /// <param name="b">原始图</param>
        /// <returns>输出图</returns>
        public static Bitmap KiBlur(Bitmap b)
        ...{

            if (b == null)
            ...{
                return null;
            }

            int w = b.Width;
            int h = b.Height;

            try
            ...{

                Bitmap bmpRtn = new Bitmap(w, h, PixelFormat.Format24bppRgb);

                BitmapData srcData = b.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
                BitmapData dstData = bmpRtn.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

                unsafe
                ...{
                    byte* pIn = (byte*)srcData.Scan0.ToPointer();
                    byte* pOut = (byte*)dstData.Scan0.ToPointer();
                    int stride = srcData.Stride;
                    byte* p;

                    for (int y = 0; y < h; y++)
                    ...{
                        for (int x = 0; x < w; x++)
                        ...{
                            //取周围9点的值
                            if (x == 0 || x == w - 1 || y == 0 || y == h - 1)
                            ...{
                                //不做
                                pOut[0] = pIn[0];
                                pOut[1] = pIn[1];
                                pOut[2] = pIn[2];
                            }
                            else
                            ...{
                                int r1, r2, r3, r4, r5, r6, r7, r8, r9;
                                int g1, g2, g3, g4, g5, g6, g7, g8, g9;
                                int b1, b2, b3, b4, b5, b6, b7, b8, b9;

                                float vR, vG, vB;

                                //左上
                                p = pIn - stride - 3;
                                r1 = p[2];
                                g1 = p[1];
                                b1 = p[0];

                                //正上
                                p = pIn - stride;
                                r2 = p[2];
                                g2 = p[1];
                                b2 = p[0];

                                //右上
                                p = pIn - stride + 3;
                                r3 = p[2];
                                g3 = p[1];
                                b3 = p[0];

                                //左侧
                                p = pIn - 3;
                                r4 = p[2];
                                g4 = p[1];
                                b4 = p[0];

                                //右侧
                                p = pIn + 3;
                                r5 = p[2];
                                g5 = p[1];
                                b5 = p[0];

                                //右下
                                p = pIn + stride - 3;
                                r6 = p[2];
                                g6 = p[1];
                                b6 = p[0];

                                //正下
                                p = pIn + stride;
                                r7 = p[2];
                                g7 = p[1];
                                b7 = p[0];

                                //右下
                                p = pIn + stride + 3;
                                r8 = p[2];
                                g8 = p[1];
                                b8 = p[0];

                                //自己
                                p = pIn;
                                r9 = p[2];
                                g9 = p[1];
                                b9 = p[0];

                                vR = (float)(r1 + r2 + r3 + r4 + r5 + r6 + r7 + r8 + r9);
                                vG = (float)(g1 + g2 + g3 + g4 + g5 + g6 + g7 + g8 + g9);
                                vB = (float)(b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9);

                                vR /= 9;
                                vG /= 9;
                                vB /= 9;

                                pOut[0] = (byte)vB;
                                pOut[1] = (byte)vG;
                                pOut[2] = (byte)vR;

                            }

                            pIn += 3;
                            pOut += 3;
                        }// end of x

                        pIn += srcData.Stride - w * 3;
                        pOut += srcData.Stride - w * 3;
                    } // end of y
                }

                b.UnlockBits(srcData);
                bmpRtn.UnlockBits(dstData);

                return bmpRtn;
            }
            catch
            ...{
                return null;
            }

        } // end of KiBlur

当然这是最简单的一种,不支持柔化半径选择。实际中通常需要自定义模糊的程度,这个下回再谈。

C#图片处理之:最简单的柔化算法相关推荐

  1. 图片播放器 简单使用

    (1)前台_客户端:     var focus_width=800;//图片宽     var focus_height=600;//图片高     var text_height=20;//字高 ...

  2. 图片加水印的简单方法

    图片加水印的简单方法~许多小伙伴都习惯在需要对外发布的图片上添加水印,添加水印后就不必担心图片被盗用或被用于其它不良目的,给我们造成不好的影响.然而,许多用户不知道如何为图片添加水印,也不知道应该选择 ...

  3. Unity Shader 之 正方形图片四角圆角的简单实现(不用遮罩Mask)

    Unity Shader 之 正方形图片四角圆角的简单实现(不用遮罩Mask) 目录 Unity Shader 之 正方形图片四角圆角的简单实现(不用遮罩Mask)

  4. 基于opencv的图片模板匹配及其简单应用

    opencv的图片模板匹配及其简单应用 我的个人博客 基础知识 基于opencv的图片模板匹配 注: python及其相关包的安装不在讨论范围内 opencv提供了图片模板匹配的方法, cv2.mat ...

  5. 英语计算机手抄报图片大全,三年级简单英语手抄报漂亮

    作为一名三年级的学生,想要学好英语可以通过做简单漂亮的英语手抄报来增加对学习英语的兴趣.下面是学习啦小编为大家整理了一些三年级简单英语手抄报漂亮,希望大家喜欢. 三年级简单漂亮的英语手抄报资料:电脑寡 ...

  6. 不会吧,不会吧,不会还有人不知道Python给图片加水印超级简单哦

    不会吧,不会吧,不会还有人不知道❤️Python给图片加水印❤️超级简单哦 文章目录 不会吧,不会吧,不会还有人不知道❤️Python给图片加水印❤️超级简单哦 介绍 安装模块 进行添加水印的操作 结 ...

  7. 计算机画图水印怎么可以消除,如何去掉图片水印 画图工具简单去掉图片水印教程-电脑教程...

    相信大家都会有这样的经历,在网上下载的很多图片上都会有水印,但如果我们为了美观,要去掉图片水印该如何实现呢?对于很多朋友来说,这可能是一个比较复杂的问题,因为自己不会PS.其实华强电子网小编告诉大家, ...

  8. ICLR 2023 超高分工作|把图片视为点集,简单聚类算法实现强悍视觉架构

    编|科技猛兽 源|极市平台 在本文中,作者回顾了视觉表征的一类经典方法:聚类 (Clustering) .作者将这种范式称之为上下文聚类 (Context Cluster).这是一种新的用于视觉表征的 ...

  9. 图像处理之简单脸谱检测算法

    from: http://blog.csdn.net/jia20003/article/details/7596443 图像处理之简单脸谱检测算法(Simple Face Detection Algo ...

最新文章

  1. echarts树图节点垂直间距_矿棉板吊顶标准工艺节点
  2. 数据流通与交易国家实验室成立 由上海牵头组建瞄准行业重大需求
  3. 10锁屏幻灯片_手机跟我学第一百八十八课——如何设置锁屏
  4. AI与医学:AI预测结合医学案例应用——当基因编辑转角遇到AI
  5. OutOfMemoryError: GC Overhead Limit Exceeded错误处理
  6. PS菜鸟入门 -- 添加滤镜
  7. JavaScript调用服务器事件
  8. Struts 2.x No result defined for action 异常
  9. sle linux lftp禁止匿名登陆_软件测试常用linux命令整理
  10. 【2017年第1期】CCF大专委2017年大数据发展趋势预测
  11. 请假一天,回粤西老家买了套房
  12. Rust 学习笔记——智能指针
  13. 分享程序员成长故事 解析IT职场困惑
  14. 虚拟机下安装MSDN简体中文版win98SC_WIN98SE.exe
  15. 三星android rom开发者,三星s10刷机包安卓10(极光AuroraROM 13.0)
  16. 用java制作扑克牌_利用java如何实现扑克牌小游戏
  17. 2022-03-27 screenX和clientX的区别以及offsetX和pageX的区别
  18. react项目中遇到的几个问题
  19. 接口文档编写步骤与格式
  20. 方舟生存服务器没有响应怎么办,方舟生存进化搜服务器闪退怎么办? Fata error临时解决办法一览...

热门文章

  1. 天梯——赌马 (20 分)
  2. Druid monitor中SQL监控显示不出数据(已解决)
  3. 利用函数求两个数的最大值
  4. 案例-图片缩放(CSS3)
  5. Open3d之颜色映射优化
  6. html5 超链接 图像映射,链接图像
  7. java字面量和符号引用_JVM中的直接引用和符号引用
  8. 搜狗输入法电脑版_年终福利 | 安卓可用的输入法皮肤 搜狗篇 / 近期日程 | iOS智能深色版。...
  9. 移动端适配之二:visual viewport、layout viewport和ideal viewport介绍 1
  10. linux进程管理相关概念