【class】C#指针二值化代码
93°2009/07/29软件综合 IP:广东
用指针那是相当的快。。相当的爽。。。普通验证码基本1ms之内解决掉

这里暂时是RGB2L法,要RGB2H的改一下就好
编译好的类


attachment icon Binary.rar 2.53KB RAR 31次下载


using System;
using XXXXXXXXXXXXXXXXXXXXXneric;
using XXXXXXXXXXponentModel;
using System.Data;
using System.Drawing;
using System.Text;

namespace Binary
{
    public class CSunsafe
    {
        private XXXXXXXXXXXXXXXXXtmap curBitmap;
        private int[,] pic;

        public void File_Init(string sFilename)
        {
            if (sFilename != null)
            {
                curBitmap = (Bitmap)XXXXXXXXomFile(sFilename);
            }
        }

        public void BMP_Init(Bitmap BMP)
        {
            if (BMP != null)
            {
                curBitmap = BMP;
            }
        }

        private double Max(double a, double b)
        {
            if (a > b)
            {
                return a;
            }
            return b;
        }

        private double Min(double a, double b)
        {
            if (a < b)
            {
                return a;
            }
            return b;
        }

        private double RGB2H(double r, double g, double b)
        {
            double h;
            r /= 255.0;
            g /= 255.0;
            b /= 255.0;
            double mi = this.Min(r, this.Min(g, b));
            double ma = XXXXXXXx(r, XXXXXXXx(g, b));
            h = 0;
            double del_max = ma - mi;
            if (del_max == 0.0)
            {
                return 0.0;
            }
            double del_r = ((ma - (r / 6.0)) + (del_max / 2.0)) / del_max;
            double del_g = ((ma - (g / 6.0)) + (del_max / 2.0)) / del_max;
            double del_b = ((ma - (b / 6.0)) + (del_max / 2.0)) / del_max;

            if (r == ma)
            {
                h = del_b - del_g;
            }
            else if (g == ma)
            {
                h = (1.0/3.0 + del_r) - del_b;
            }
            else if (b == ma)
            {
                h = (2.0/3.0 + del_g) - del_r;
            }
            if (h < 0.0)
            {
                h++;
            }
            if (h > 1.0)
            {
                h--;
            }
            return h;
        }


        private double RGB2L(double r, double g, double b)
        {
            r /= 255.0;
            g /= 255.0;
            b /= 255.0;
            double mi = this.Min(r, this.Min(g, b));
            return ((XXXXXXXx(r, XXXXXXXx(g, b)) + mi) / 2.0);
        }


        public int[,] Binary(double value)
        {
            if (curBitmap != null)
            {
                Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
                XXXXXXXXXXXXXXXXXXXXXXXXXtmapData bmpData = curBitmap.LockBits(rect, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXadWrite, curBitmap.PixelFormat);
                pic = new int [bmpData.Width,bmpData.Height];
                unsafe
                {
                    byte* ptr = (byte*)(XXXXXXXXXXan0);
                    for (int i = 0; i < bmpData.Height; i++)
                    {
                        for (int j = 0; j < bmpData.Width; j++)
                        {
                            if (RGB2L(ptr[2], ptr[1], ptr[0]) < value)
                            {
                                pic[j, i] = 1;
                            }
                            else
                            {
                                pic[j, i] = 0;
                            }
                            
                            ptr += 3;
                        }
                        ptr += XXXXXXXXXXride - bmpData.Width * 3;
                    }
                }
                curBitmap.UnlockBits(bmpData);
                return pic;
            }
            else
            {
                return null;
            }
        }
    }
}


要编译本代码请允许不安全代码 如下图所示

unsafe.png


Binary.img.png
+1000  科创币    delete    2009/07/29 试试评个分
来自:计算机科学 / 软件综合
19
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
93° 作者
15年6个月前 IP:未同步
133241
最近爱上C#了 。。爱上C#了……C#…… 。。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
chiataimakra
15年6个月前 IP:未同步
133243
算法很恶心(或者说我没看懂。。。有可能的)

提出二值化算法:

RGB,阈值为y
输出为gray


alpha = 3*y

if R+G+B<alpha then return 1
(如果不是,自然就是0了,不用加一句else return 0
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊
15年6个月前 IP:未同步
133245
RGB2H是把RGB转换为色度。
RGB2L是把RGB转换为饱和度。

chia的思路有点类似判断亮度,但实际上亮度计算R、G、B是有权重的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
chiataimakra
15年6个月前 IP:未同步
133246
然后就是这一段
if (RGB2L(ptr[2], ptr[1], ptr[0]) < value)
                            {
                                pic[j, i] = 1;
                            }
                            else
                            {
                                pic[j, i] = 0;
                            }
表示不满,为什么不直接这样写:
pic[j,i]=(RGB2L(ptr[2], ptr[1], ptr[0]) < value)

一定程度上说明了您的一定程度上的一定程度的问题。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
chiataimakra
15年6个月前 IP:未同步
133247
引用第3楼qwernet于2009-07-29 16:53发表的  :
RGB2H是把RGB转换为色度。
RGB2L是把RGB转换为饱和度。

chia的思路有点类似判断亮度,但实际上亮度计算R、G、B是有权重的。

对不起弄错了。海涵……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
chiataimakra
15年6个月前 IP:未同步
133250
这。。。
有点。。。
引用第3楼qwernet于2009-07-29 16:53发表的  :
RGB2H是把RGB转换为色度。
RGB2L是把RGB转换为饱和度。

chia的思路有点类似判断亮度,但实际上亮度计算R、G、B是有权重的。

L(Lightness)是亮度吧。。。怎么RGB2L变成饱和度了。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年6个月前 IP:未同步
133252
引用第2楼chiataimakra于2009-07-29 16:50发表的  :
算法很恶心(或者说我没看懂。。。有可能的)

提出二值化算法:

RGB,阈值为y
.......

去试一试就知道了,这个算法在我以前的帖子里就已经发过,对于某种验证码 比如我这次做的,基本无效
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年6个月前 IP:未同步
133253
引用第4楼chiataimakra于2009-07-29 16:54发表的  :
然后就是这一段
if (RGB2L(ptr[2], ptr[1], ptr[0]) < value)
                            {
                                pic[j, i] = 1;
                            }
.......

请参见MSDN
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年6个月前 IP:未同步
133255
引用第2楼chiataimakra于2009-07-29 16:50发表的  :

(如果不是,自然就是0了,不用加一句else return 0


= = 在很大程度上表现出您对C#的不了解
还有,null不是0 。。。。如果在这个function里返回0会报错的,人家要的是二维数组。。您返回个0

null=nothing=nil=什么都没有

如果去掉return null

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊
15年6个月前 IP:未同步
133256
Re:这。。。
引用第6楼chiataimakra于2009-07-29 16:58发表的 这。。。 :
有点。。。

L(Lightness)是亮度吧。。。怎么RGB2L变成饱和度了。。。


哦,看错了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年6个月前 IP:未同步
133258
引用第2楼chiataimakra于2009-07-29 16:50发表的  :
算法很恶心(或者说我没看懂。。。有可能的)

提出二值化算法:

RGB,阈值为y
.......

参见这里XXXXXXXXXXXXXXXXXXXXXXXX/t/12553
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊
15年6个月前 IP:未同步
133260
明度、亮度
[s:94][s:94]
引用第6楼chiataimakra于2009-07-29 16:58发表的 这。。。 :
有点。。。

L(Lightness)是亮度吧。。。怎么RGB2L变成饱和度了。。。


这个其实也不叫亮度,叫明度。

这个才是亮度:0.299*R+0.587*G+0.114*B

哎,名词我都搞乱了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年6个月前 IP:未同步
133263
引自《C++ primer》

定义变量时,应该给变量赋初始值,除非确定变量用于其它意图之前会覆盖这个初值。

虽然是关于cpp的,但是所有编程语言都应该这样做,“如果不是自然就是0了”很明显是不符合编程规范的
使用C的时候就囧死你了,int i,直接出i的值的话保证囧飞你
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年6个月前 IP:未同步
133265
虽然说我命名极其不规范,UI极其不规范,但是我这个编程思想还是要规范的 。。。 = =
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
chiataimakra
15年6个月前 IP:未同步
133266
了解,是我脑残了,VB用多了。我知道要在前面加"!@#$@#%$! = 0"这句。。。。

另外,明度是。。。我想起来了。。。
在PS7里,HSL被变成了HSB,B=brightness

画图里面是HSL

Lab色彩空间内,L是limitude照明度。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°作者
15年6个月前 IP:未同步
133267
送上测试代码

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles XXXXXXXXXXick
        Dim binary_frame As New Binary.CSunsafe
        binary_XXXXXXXXP_Init(XXXXXXXXXXXXXXage)
        pic = binary_XXXXXXXXnary_L(0.6)

        debug(pic, 50, 85)

    End Sub

    Public Function debug(ByVal pic(,) As Integer, ByVal width As Integer, ByVal height As Integer)
        Dim bmp As New Bitmap(width + 1, height + 1)
        Dim i, j As Integer
        For i = 0 To width
            For j = 0 To height
                If pic(i, j) = 1 Then
                    XXXXXXtPixel(i, j, Color.Black)
                End If
            Next
        Next
        Dim frm As New Form
        XXXXXXckgroundImage = bmp
        XXXXXXckgroundImageLayout = ImageLayout.Center
        XXXXXXow()
        Return Nothing
    End Function
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
小俊
15年6个月前 IP:未同步
133269
引用第15楼chiataimakra于2009-07-29 17:27发表的  :
了解,是我脑残了,VB用多了。我知道要在前面加"!@#$@#%$! = 0"这句。。。。

另外,明度是。。。我想起来了。。。
在PS7里,HSL被变成了HSB,B=brightness

.......


嗯,名称变来变去都搞不清了,咱们自己知道咋回事就行了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
xinstar
12年11个月前 IP:未同步
369719
真好,谢谢
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
93°
学者 笔友
文章
651
回复
6032
学术分
30
2007/04/10注册,6年11个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}