C#图像处理之边缘检测(Sobel)的方法

本文实例讲述了C#图像处理之边缘检测(Sobel)的方法。分享给大家供大家参考。具体如下:

//定义sobel算子函数
private static Bitmap sobel(Bitmap a)
{
 int w = a.Width;
 int h = a.Height;
 try
 {
  Bitmap dstBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  System.Drawing.Imaging.BitmapData srcData = a.LockBits(new Rectangle
   (0, 0, w, h), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  System.Drawing.Imaging.BitmapData dstData = dstBitmap.LockBits(new Rectangle
   (0, 0, w, h), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
  unsafe
  {
   byte* pIn = (byte*)srcData.Scan0.ToPointer();
   byte* pOut = (byte*)dstData.Scan0.ToPointer();
   byte* p;
   int stride = srcData.Stride;
   for (int y = 0; y < h; y++)
   {
   for (int x = 0; x < w; x++)
   {
    //边缘八个点像素不变
    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 r0, r1, r2, r3, r4, r5, r6, r7, r8;
    int g1, g2, g3, g4, g5, g6, g7, g8, g0;
    int b1, b2, b3, b4, b5, b6, b7, b8, b0;
    double 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;
    r0 = p[2];
    g0 = p[1];
    b0 = p[0];
    //使用模板
    vR = (double)(Math .Abs (r1+2*r4+r6-r3-2*r5-r8)+Math .Abs (r1+2*r2+r3-r6-2*r7-r8));
    vG = (double)(Math .Abs (g1+2*g4+g6-g3-2*g5-g8)+Math .Abs (g1+2*g2+g3-g6-2*g7-g8));
    vB = (double)(Math .Abs (b1+2*b4+b6-b3-2*b5-b8)+Math .Abs (b1+2*b2+b3-b6-2*b7-b8));
    if (vR > 0)
    {
     vR = Math.Min(255, vR);
    }
    else
    {
     vR = Math.Max(0, vR);
    }
    if (vG > 0)
    {
     vG = Math.Min(255, vG);
    }
    else
    {
     vG = Math.Max(0, vG);
    }
    if (vB > 0)
    {
     vB = Math.Min(255, vB);
    }
    else
    {
     vB = Math.Max(0, vB);
    }
    pOut[0] = (byte)vB;
    pOut[1] = (byte)vG;
    pOut[2] = (byte)vR;
    }
    pIn += 3;
    pOut += 3;
   }
   pIn += srcData.Stride - w * 3;
   pOut += srcData.Stride - w * 3;
   }
  }
  a.UnlockBits(srcData);
  dstBitmap.UnlockBits(dstData);
  return dstBitmap;
 }
 catch
 {
  return null;
 }
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#图像亮度调整的方法

    本文实例讲述了C#图像亮度调整的方法.分享给大家供大家参考.具体如下: //定义数字图象处理之(亮度调整函数) private static Bitmap BrightnessP(Bitmap a, int v) { System.Drawing.Imaging.BitmapData bmpData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite

  • C#图像对比度调整的方法

    本文实例讲述了C#图像对比度调整的方法.分享给大家供大家参考.具体如下: //定义对比度调整函数 private static Bitmap ContrastP(Bitmap a, double v) { System.Drawing.Imaging.BitmapData bmpData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, Syst

  • C#图像灰度级拉伸的方法

    本文实例讲述了C#图像灰度级拉伸的方法.分享给大家供大家参考.具体如下: //定义图像灰度拉伸函数 private static Bitmap GrayLP (Bitmap a) { Rectangle rect = new Rectangle(0, 0, a.Width, a.Height); System.Drawing.Imaging.BitmapData srcData = a.LockBits(rect, System.Drawing.Imaging.ImageLockMode.Rea

  • C#图像处理之边缘检测(Smoothed)的方法

    本文实例讲述了C#图像处理之边缘检测(Smoothed)的方法.分享给大家供大家参考.具体如下: //定义smoothed算子边缘检测函数 private static Bitmap smoothed(Bitmap a) { int w = a.Width; int h = a.Height; try { Bitmap dstBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.D

  • C#图像处理之图像平移的方法

    本文实例讲述了C#图像处理之图像平移的方法.分享给大家供大家参考.具体如下: //定义图像平移函数 private static Bitmap offsetp(Bitmap a,int s,int v) { System.Drawing.Imaging.BitmapData srcData = a.LockBits(new Rectangle (0,0,a.Width ,a.Height) ,System .Drawing .Imaging .ImageLockMode .ReadWrite ,

  • C#数字图象处理之图像灰度化方法

    本文实例讲述了C#数字图象处理之图像灰度化方法.分享给大家供大家参考.具体如下: //定义图像灰度化函数 private static Bitmap PGray(Bitmap src) { int w = src.Width; int h = src.Height; //构建与原图像大小一样的模版图像 Bitmap dstBitmap = new Bitmap(src.Width, src.Height, System.Drawing.Imaging.PixelFormat.Format24bp

  • C#实现图像反色的方法

    本文实例讲述了C#实现图像反色的方法.分享给大家供大家参考.具体如下: //定义图像反色函数 private static Bitmap PContray (Bitmap a) { int w = a.Width; int h = a.Height; Bitmap dstBitmap = new Bitmap(a.Width, a.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imaging.

  • C#实现图像锐化的方法

    本文实例讲述了C#实现图像锐化的方法.分享给大家供大家参考.具体如下: //定义图像锐化函数 private static Bitmap Sharpen(Bitmap a,double v) { int w = a.Width; int h = a.Height; try { Bitmap dstBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imaging.

  • C#图像线性变换的方法

    本文实例讲述了C#图像线性变换的方法.分享给大家供大家参考.具体如下: //定义图像线性运算函数(y=kx+v) private static Bitmap LinearOP(Bitmap a, double k, double v) { Rectangle rect = new Rectangle(0, 0, a.Width, a.Height); System.Drawing.Imaging.BitmapData srcData = a.LockBits(rect, System.Drawi

  • C#图像处理之边缘检测(Sobel)的方法

    本文实例讲述了C#图像处理之边缘检测(Sobel)的方法.分享给大家供大家参考.具体如下: //定义sobel算子函数 private static Bitmap sobel(Bitmap a) { int w = a.Width; int h = a.Height; try { Bitmap dstBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imagin

  • Python图像处理之边缘检测原理详解

    目录 原理 Sobel检测算子 Laplacian算子 算子比较 原理 边缘检测是图像处理和计算机视觉当中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,图像的边缘检测可以大幅度的减少数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性,它们绝大多数可以分为两类:基于搜索和基于零穿越. 基于搜索:通过寻找图像一阶导数中max来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并在此方向找到局部梯度模的最大值,代表的算法是Sobel算子和Scharr算子.

  • C#图像处理之霓虹效果实现方法

    本文实例讲述了C#图像处理之霓虹效果实现方法.分享给大家供大家参考.具体如下: //定义霓虹处理函数 public Bitmap PNihong(Bitmap a) { try { int w = a.Width; int h = a.Height; Bitmap dstBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imaging.BitmapData sr

  • C#数字图像处理之图像缩放的方法

    本文实例讲述了C#数字图像处理之图像缩放的方法.分享给大家供大家参考.具体如下: //定义图像缩放函数 private static Bitmap ZoomP(Bitmap a, float s, float v) { Bitmap bmp = new Bitmap((int)(a.Width * s), (int)(a.Height * v), System.Drawing.Imaging.PixelFormat.Format24bppRgb); Graphics g = Graphics.F

  • python图像处理之反色实现方法

    本文实例讲述了python图像处理之反色实现方法.分享给大家供大家参考.具体如下: 我们先加载一个8位灰度图像 每一个像素对应的灰度值从0-255 则只需要读取每个像素的灰度值A,再将255-A写入 这样操作一遍后,图像就会反色了 这里运行环境为: Python为:Python2.7.6 OpenCV2.4.10版(可到http://sourceforge.net/projects/opencvlibrary/files/opencv-win/下载) numpy为:numpy-1.9.1-win

  • C#图像处理之木刻效果实现方法

    本文实例讲述了C#图像处理之木刻效果实现方法.分享给大家供大家参考.具体如下: //木刻效果 public Bitmap PFilterMuKe(Bitmap src) { try { Bitmap a = new Bitmap(src); Rectangle rect = new Rectangle(0, 0, a.Width, a.Height); System.Drawing.Imaging.BitmapData bmpData = a.LockBits(rect, System.Draw

  • C#图像处理之头发检测的方法

    本文实例讲述了C#图像处理之头发检测的方法.分享给大家供大家参考.具体如下: //发色检测(YCbCr颜色空间) public Bitmap HairD(Bitmap a) { Rectangle rect = new Rectangle(0, 0, a.Width, a.Height); System.Drawing.Imaging.BitmapData bmpData = a.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWr

  • Python图像处理之简单画板实现方法示例

    本文实例讲述了Python图像处理之简单画板实现方法.分享给大家供大家参考,具体如下: Python图像处理也是依赖opencv的Python接口实现的,Python语言简单易懂,简洁明了.本次实现画板涂鸦,一个是在里面画矩形,还有画线.其他也都可以扩展,本案例只做例程,思路是对鼠标事件的处理,以及滚动条调节颜色处理.鼠标事件就包含有左键按下,以及释放事件的处理. import cv2 import numpy as np # null function def nothing(x): pass

随机推荐