• 大小: 41KB
    文件类型: .cs
    金币: 1
    下载: 0 次
    发布日期: 2021-06-06
  • 语言: C#
  • 标签: C#  角点  CSS  Harris  

资源简介

根据Harris算法 CSS算法写的一个简单图像角点检测类

资源截图

代码片段和文件信息

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Postrue_Correction.ClassLib.Image
{
    class MyImageCorner
    {
        #region Need
        /// 
        /// 生成并初始化一个8位灰度图像
        /// 

        public static Bitmap CreateGrayscaleImage(int width int height)
        {
            Bitmap bmp = new Bitmap(width height PixelFormat.Format8bppIndexed);
            // 设置调色板
            SetGrayscalePalette(bmp);
            return bmp;
        }

        /// 
        /// 设置位图的调色板至灰度模式
        /// 

        private static void SetGrayscalePalette(Bitmap srcImg)
        {
            // 检查像素格式
            if (srcImg.PixelFormat != PixelFormat.Format8bppIndexed)
                throw new ArgumentException();

            // 获取调色板
            ColorPalette cp = srcImg.Palette;
            // 初始化调色板
            for (int i = 0; i < 256; i++)
            {
                cp.Entries[i] = Color.FromArgb(i i i);
            }
            // 设置调色板
            srcImg.Palette = cp;
        }
        #endregion

        /// 
        /// Harris角点检测
        /// 

        /// 
        /// 
        /// 
        public static Bitmap Harris(Bitmap srcBitmap byte threshold)
        {
            int w = srcBitmap.Width;
            int h = srcBitmap.Height;
            Bitmap rs = CreateGrayscaleImage(w h);

            Rectangle rect = new Rectangle(0 0 srcBitmap.Width srcBitmap.Height);
            BitmapData bmpData = srcBitmap.LockBits(rect ImageLockMode.ReadOnly srcBitmap.PixelFormat);
            BitmapData rsData = rs.LockBits(rect ImageLockMode.WriteOnly PixelFormat.Format8bppIndexed);

            int step = 1;
            switch (srcBitmap.PixelFormat)
            {
                case PixelFormat.Format24bppRgb: step = 3;
                    break;
                case PixelFormat.Format32bppArgb: step = 4;
                    break;
                case PixelFormat.Format8bppIndexed: step = 1;
                    break;
            }

            int istride = bmpData.Stride;
            int ostride = rsData.Stride;

            double gradX gradY;
            double[] gradXX = new double[ostride * h];//x方向梯度的平方的数组
            double[] gradYY = new double[ostride * h];//y方向梯度的平方的数组
            double[] gradXY = new double[ostride * h];//x方向梯度与y方向梯度的乘积的数组
            double[] CRF = new double[ostride * h];//存储可能的角点

            unsafe
            {
                byte* pin = (byte*)bmpData.Scan0.ToPointer();
                byte* pout = (byte*)rsData.Scan0.ToPointer();
                //计算梯度
                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; 

评论

共有 条评论