C# 指针操作图像 二值化处理

        /// <summary>
        /// 二值化图像
        /// </summary>
        /// <param name="bmp"></param>
        /// <returns></returns>
        private static unsafe Bitmap Binaryzation(Bitmap bmp)
        {
            BitmapData dstData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
            byte* data = (byte*)(dstData.Scan0);
            //将图像转换为0,1二值得图像;
            int step = dstData.Stride;

            int means = getThreshold(data, bmp.Height * step);
            for (int y = 0; y < bmp.Height; y++)
            {
                for (int x = 0; x < bmp.Width * 3; x += 3)
                {
                    if (data[y * step + x + 2] > means)
                        data[y * step + x]
                            = data[y * step + x + 1]
                            = data[y * step + x + 2]
                            = 255;
                    else
                        data[y * step + x]
                            = data[y * step + x + 1]
                            = data[y * step + x + 2]
                            = 0;
                }
            }
            bmp.UnlockBits(dstData);
            return bmp;
        }

        /// <summary>
        /// 图像二值化 获取阀值
        /// </summary>
        /// <param name="inPixels"></param>
        /// <param name="length">height * Stride</param>
        /// <returns></returns>
        private static unsafe int getThreshold(byte* inPixels, int length)
        {
            int inithreshold = 127;
            int finalthreshold = 0;
            List<int> temp = new List<int>();
            for (int index = 0; index < length; index += 3)
            {
                temp.Add(inPixels[index + 2]);
            }
            List<int> sub1 = new List<int>();
            List<int> sub2 = new List<int>();
            int means1 = 0, means2 = 0;
            while (finalthreshold != inithreshold)
            {
                finalthreshold = inithreshold;
                for (int i = 0; i < temp.Count(); i++)
                {
                    if (temp[i] <= inithreshold)
                    {
                        sub1.Add(temp[i]);
                    }
                    else
                    {
                        sub2.Add(temp[i]);
                    }
                }
                means1 = getMeans(sub1);
                means2 = getMeans(sub2);
                sub1.Clear();
                sub2.Clear();
                inithreshold = (means1 + means2) / 2;
            }
            return finalthreshold;
        }

        /// <summary>
        /// 图像二值化 获取Means
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private static int getMeans(List<int> data)
        {
            int result = 0;
            int size = data.Count();
            foreach (int i in data)
            {
                result += i;
            }
            return (result / size);
        }
时间: 2024-12-20 04:31:12

C# 指针操作图像 二值化处理的相关文章

图像处理之积分图应用四(基于局部均值的图像二值化算法)

图像处理之积分图应用四(基于局部均值的图像二值化算法) 基本原理 均值法,选择的阈值是局部范围内像素的灰度均值(gray mean),该方法的一个变种是用常量C减去均值Mean,然后根据均值实现如下操作: pixel = (pixel > (mean - c)) ? object : background 其中默认情况下参数C取值为0.object表示前景像素,background表示背景像素. 实现步骤 1. 彩色图像转灰度图像 2. 获取灰度图像的像素数据,预计算积分图 3. 根据输入的参数

一种超级快速的图像二值化技术

在计算机视觉中,对图像进行二值化恐怕是最常见的操作了.为了检测目标,可能需要对每一帧图像的每一个像素点进行运算.如果能提升二值化的速度,那么,你的算法的效率就会大大的提高.本文,将介绍一种超级快速的图像二值化技术. 要解决的问题: 如上图所示,需要把彩色图像中, (1) R通道介于(smoevalue1, somevalue2)(2) G通道介于(somevalue3, somevalue4)(3) B通道介于(somevalue5, somevalue6)当图像中某个像素点同时满足上面3个条件

基于直方图的图像二值化算法实现

引言 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.在过去年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在分类方法中,基于直方图的全局二值算法都从不同的科学层次提出了各自的实施方案,并且这类方法都有着一些共同的特点:简单.算法容易实现和执行速度快. 算法代码 第一种方法Huang L.-K et al.参考代

数学之路-python计算实战(8)-机器视觉-图像二值化

二值化 hreshold Applies a fixed-level threshold to each array element. C++: double threshold(InputArray src, OutputArray dst, double thresh, doublemaxval, int type) Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst C: double cvThresh

opencv2对读书笔记——图像二值化——thresholded函数

opencv中的图像二值化函数threshold函数 其结构 double cv::threshold( //二值化函数 const CvArr* src, //原始图像 CvArr* dst, //输出图像 double threshold, //阈值 double max_value, //最大值 int threshold_type//阈值类型 ); 实例代码 #include "cv.h" #include "highgui.h" int main() {

MATLAB:图像二值化、互补图(反运算)(im2bw,imcomplement函数)

图像二值化.反运算过程涉及到im2bw,imcomplement函数,反运算可以这么理解:原本黑的区域变为白的区域,白的区域变为黑的区域. 实现过程如下: close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear all; clc; J=imread('rice.png');% 读取灰度图像,赋值给J J1=im2bw(J);%将灰度图像转换成二值图像,赋值给J1 J2=imcomplement(J);%求灰度图像的补,即对图像进行求反运算,赋值给J2 J

图像基本变换---图像二值化(包含OSTU/迭代法/统计法/双峰法/P分位法/最大熵法)

OSTU法图像二值化 [算法说明] Ostu法又叫做最大类间方差法,是一种常用的图像分割算法.基本算法思想是根据初始阈值把图像分为两类,然后计算两类之间的方差,更新阈值,重新计算类间方差,当满足类间方差最大时的阈值,即为所求最佳阈值,具体过程如下: 1,初始化一阈值Th,将图像f(x,y)分为A,B两类: 2,分别计算A,B两类像素集合的均值ua和ub,公式如下: 其中,Na和Nb分别表示集合A,B中的像素个数. 3,计算A,B两类的类间方差,公式如下: 4,将Th从0到255循环,分别计算A,

Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化

原文:Win8 Metro(C#)数字图像处理--2.56简单统计法图像二值化  [函数名称] 简单统计法图像二值化 WriteableBitmap StatisticalThSegment(WriteableBitmap src) /// <summary> /// Statistical method of image segmention. /// </summary> /// <param name="src">The source im

记录一个优秀的图像二值化代码

#region 二值化02 public Bitmap binaryzation(Bitmap srcBitmap, Bitmap dstBitmap) { int threshold = 0; Byte[,] BinaryArray = ToBinaryArray(srcBitmap, out threshold); dstBitmap = BinaryArrayToBinaryBitmap(BinaryArray); return dstBitmap; } /// <summary> //