信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 4938|回复: 7
打印 上一主题 下一主题

[『VB.NET 图文教程』] VB.NET让图片黑白色原来是如此简单呀

[复制链接]

1868

主题

1878

帖子

1万

积分

积分
10928
跳转到指定楼层
宣传软件楼主
发表于 2017-5-23 23:49:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

软件教程首图:

软件教程分类:VB.NET 图文教程 

软件图文教程视频教程分类:软件图文教程 

软件教程难易程度:软件高级教程 

软件教程发布日期:2017-05-23

软件教程关键字:VB.NET让图片黑白色原来是如此简单呀

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件定制网站 网址:http://www.postbbs.com

软件教程详细描述
本帖最后由 群发软件 于 2017-5-23 23:51 编辑

 原始图片

VB.NET让图片黑白色原来是如此简单呀 b2b软件

  黑白处理后图片

VB.NET让图片黑白色原来是如此简单呀 b2b软件

  原始图片:

VB.NET让图片黑白色原来是如此简单呀 b2b软件

  黑白处理后图片:

VB.NET让图片黑白色原来是如此简单呀 b2b软件

  部分处理代码:

  VB.NET code

  ……

  Dim ts2 As IThresholder = New GlobalMeanThreshold(inbmp)

  Dim tsBMP As New Bitmap(PictureBox1.Width, PictureBox1.Height)

  ts2.RenderToBitmap(tsBMP)

  PictureBox6.Image = tsBMP

  PictureBox6.Height = PictureBox1.Height

  PictureBox6.Width = PictureBox1.Width

  PictureBox6.Left = 0

  PictureBox6.Top = 0

  ……

  理论知识:

  灰度图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。

  灰度图像的二值化没有固定的算法,根据图像区域中目标物体的不同而有不同的二值化算法.目前最主要的方法有:最大值法,平均值法,加权平均值法

  如下边代码:

  Private Function SetBitMapToBlackAndWhite(bmp As Bitmap) As Bitmap

  Try

  Dim height As Integer = bmp.Height

  Dim Width As Integer = bmp.Width

  Dim newBitMap As New Bitmap(Width, height)

  Dim pixel As Color

  For x As Integer = 0 To Width - 1

  For y As Integer = 0 To height - 1

  pixel = bmp.GetPixel(x, y)

  Dim r As Integer

  Dim g As Integer

  Dim b As Integer

  Dim Result As Integer

  Result = 0

  r = pixel.R

  g = pixel.G

  b = pixel.B

  Dim iType As Integer = 2

  Select Case iType

  Case 0

  '平均值法

  Result = (r + g + b) / 3

  Exit Select

  Case 1

  '最大值法

  If (r > g) Then

  Result = r

  Else

  Result = g

  End If

  If (Result > b) Then

  Result = Result

  Else

  Result = b

  End If

  Exit Select

  Case 2

  '加权平均值


  Result = CInt(0.7) * r + CInt(0.2) * g + CInt(0.1) * b

  Exit Select

  End Select

  newBitMap.SetPixel(x, y, Color.FromArgb(Result, Result, Result))

  Next

  Next

  Return newBitMap

  Catch ex As Exception

  Return Nothing

  End Try

  End Function

  该函数实现的简单的图像2值化。

  实际使用中最简单的二值化算法就是根据每个像素的灰度值做舍入处理,比如二值化阀值可以设置为0-255的中值127,但是这种的二值化没有根基图像的整体灰度值所在范围做考虑,所以效果很差.

  网上流传较广的是根据图像的直方图求取阀值:可以到网上搜索,我就不重复了

  介绍我的方法:

  图像数据处理函数:由于需要对图像进行指针操作,故使用C#编写源码

  public override unsafe void DoThresholding()

  {

  System.Drawing.Imaging.BitmapData indata = InBMP.LockBits(new Rectangle(0, 0, InBMP.Width, InBMP.Height),

  System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

  byte* ptr = (byte*)indata.Scan0.ToPointer();

  Histogram his = new Histogram(indata, ptr, 0, 0, InBMP.Width, InBMP.Height);

  int mean = Math.Max((int)his.Mean, 0) * 3;

  //图像阀值

  int stride = indata.Stride;

  for (int x = this.Width - 1; x >= 0; x--)

  {

  for (int y = this.Height - 1; y >= 0; y--)

  {

  int average = (ptr[(y * stride) + (x * 3)] +

  ptr[(y * stride) + (x * 3) + 1] +

  ptr[(y * stride) + (x * 3) + 2]);

  //byte average = (byte)((ptr[(y * indata.Stride) + (x * 3) + 2]));

  if (average > mean)

  Data[x, y] = 255;

  else

  Data[x, y] = 0;

  }

  }

  InBMP.UnlockBits(indata);

  }

  }

  图像阀值的求取:

  byte[] HistogramData;

  unsafe public Histogram(System.Drawing.Imaging.BitmapData indata, byte* ptr,

  int left, int top, int width, int height)

  {

  HistogramData = new byte[256];

  for (int i = 0; i < 256; i++)

  HistogramData = 0;

  int right = Math.Min(left + width, indata.Width);

  int bottom = Math.Min(top + height, indata.Height);

  int stride = indata.Stride;

  for (int x = left; x < right; x++)

  {

  for (int y = top; y < bottom; y++)

  {

  HistogramData[ptr[(y * stride) + (x * 3)]] += 1;

  HistogramData[ptr[(y * stride) + (x * 3) + 1]] += 1;

  HistogramData[ptr[(y * stride) + (x * 3) + 2]] += 1;

  }

  }

  CalculateMean();

  CalculateMinMax();

  }

  unsafe public Histogram(byte* ptr, int stride, int imgWidth, int imgHeight,

  int left, int top, int width, int height)

  {

  HistogramData = new byte[256];

  int right = Math.Min(left + width, imgWidth);

  int bottom = Math.Min(top + height, imgHeight);

  for (int x = left; x < right; x++)

  {

  for (int y = top; y < bottom; y++)

  {

  byte average = (byte)((ptr[(y * stride) + (x * 3)] +

  ptr[(y * stride) + (x * 3) + 1] +

  ptr[(y * stride) + (x * 3) + 2]) / 3);

  HistogramData[average] += 1;

  }

  }

  CalculateMean();

  CalculateVariance();

  }

  public byte Mean;

  private int Sum;

  private int WeightedSum;

  private void CalculateMean()

  {

  int sum = 0;

  int weightedSum = 0;

  for (int i = 0; i < 256; i++)

  {

  sum += HistogramData;

  weightedSum += HistogramData * i;

  }

  Sum = sum;

  WeightedSum = weightedSum;

  if (sum > 0)

  Mean = (byte)(weightedSum / sum);

  else

  Mean = 0;

  }

  生成黑白图像

  public unsafe void RenderToBitmap(Bitmap bmp)

  {

  if (Data == null)

  DoThresholding();

  System.Drawing.Imaging.BitmapData outdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),

  System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

  byte* ptr = (byte*)outdata.Scan0.ToPointer();

  for (int x = bmp.Width - 1; x >= 0; x--)

  {

  for (int y = bmp.Height - 1; y >= 0; y--)

  {

  if (this.Data[x, y] > 0)

  {

  ptr[(y * outdata.Stride) + (x * 3)] = this.Data[x, y];

  ptr[(y * outdata.Stride) + (x * 3) + 1] = this.Data[x, y];

  ptr[(y * outdata.Stride) + (x * 3) + 2] = this.Data[x, y];

  }

  else

  {

  ptr[(y * outdata.Stride) + (x * 3)] = 0;

  ptr[(y * outdata.Stride) + (x * 3) + 1] = 0;

  ptr[(y * outdata.Stride) + (x * 3) + 2] = 0;

  }

  }

  }

  bmp.UnlockBits(outdata);

  }

  考虑到图像处理速度问题,所有图像都锁定在内存中进行操作。这样比直接操作速度快了几倍。

VB彩色BMP图片转换为黑白图片

将RGB想成3D之X,Y,Z轴,则BMP的RGB为(r,g,b)与座标(Y,Y,Y)距离最小时的Y即为灰度值
Y = 0.29900 * R 0.58700 * G 0.11400 * B
整数化
Y = ( 9798*R 19235*G 3735*B) / 32768
RGB(Y, Y, Y)就可以了
需一个内有彩色图的PictureBox, CommandBox
Option Explicit
Private Declare Function GetPixel Lib "gdi32" _
(ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" _
(ByVal hdc As Long, ByVal x As Long, _
ByVal Y As Long, ByVal crColor As Long) As Long
Private tmpPic As Picture
Private Sub Form_Load()
Picture1.ScaleMode = 3 ’设为Pixel
Picture1.AutoRedraw = True ’设定所有Pixel的改变不立即在pictureBox上显示
Set tmpPic = Picture1.Picture
End Sub
Private Sub Command1_click()
Dim width5 As Long, heigh5 As Long, rgb5 As Long
Dim hdc5 As Long, i As Long, j As Long
Dim bBlue As Long, bRed As Long, bGreen As Long
Dim Y As Long
width5 = Picture1.ScaleWidth
heigh5 = Picture1.ScaleHeight
hdc5 = Picture1.hdc
For i = 1 To width5
For j = 1 To heigh5
rgb5 = GetPixel(hdc5, i, j)
bBlue = Blue(rgb5)
bRed = Red(rgb5)
bGreen = Green(rgb5)
Y = (9798 * bRed 19235 * bGreen 3735 * bBlue) / 32768
rgb5 = RGB(Y, Y, Y)
SetPixelV hdc5, i, j, rgb5
Next j
Next i
Set Picture1.Picture = Picture1.Image ’此时才真正显示Picture

End Sub
Private Function Red(ByVal mlColor As Long) As Long
Red = mlColor And &HFF
End Function
Private Function Green(ByVal mlColor As Long) As Long
Green = (mlColor / &H100) And &HFF
End Function
Private Function Blue(ByVal mlColor As Long) As Long
Blue = (mlColor / &H10000) And &HFF
End Function


untoVB.NET表单自动实现提交 做群发软件必备技巧next好网角自动群发广告信息发布软件脚本
回复

使用道具 举报

0

主题

649

帖子

639

积分

积分
639
信息发布软件沙发
发表于 2017-5-29 08:51:13 | 只看该作者
快,页面设计很满意,而且也很,老板人不错,喜欢

回复 支持 反对

使用道具 举报

0

主题

629

帖子

627

积分

积分
627
推广工具板凳
发表于 2017-6-2 04:15:57 | 只看该作者
卖家服务很好,客服和技术都很有耐心,慢慢摸熟悉了,感觉很不错,很让人放心的平台。

回复 支持 反对

使用道具 举报

0

主题

2180

帖子

564

积分

积分
564
软件定制开发地板
发表于 2017-6-5 16:32:23 | 只看该作者
很nice的人,人品杠杠滴!!!!

回复 支持 反对

使用道具 举报

0

主题

632

帖子

630

积分

积分
630
5#定制软件#
发表于 2017-6-9 00:30:00 | 只看该作者
看帖回帖是美德!

回复 支持 反对

使用道具 举报

0

主题

605

帖子

589

积分

积分
589
6#定制软件#
发表于 2017-6-15 07:45:33 | 只看该作者
服务态度相当的好,后台好多不明白的地方都会解答,实在搞不明白的会帮我们搞定,很不错卖家。

回复 支持 反对

使用道具 举报

0

主题

630

帖子

651

积分

积分
651
7#定制软件#
发表于 2017-6-16 11:24:36 | 只看该作者
不错,功能强大,满意

回复 支持 反对

使用道具 举报

0

主题

652

帖子

646

积分

积分
646
8#定制软件#
发表于 2017-6-22 17:19:11 | 只看该作者
太好了,第一次合作出来效果很满意!继续合作多介绍客户给你们哈

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
信息发布软件AIWROK软件找字与OCR方法汇总示例
AIWROK软件找字与OCR方法汇总示例
信息发布软件AIWROK软件找图方法汇总示例
AIWROK软件找图方法汇总示例
信息发布软件AIWROK软件滑动方法集合示例
AIWROK软件滑动方法集合示例
信息发布软件AIWROK软件安卓AIWROK汇集软件点击
AIWROK软件安卓AIWROK汇集软件点击
信息发布软件苹果系统点击方法综合示例
苹果系统点击方法综合示例
信息发布软件AIWROK苹果系统找图方法完整示例集合
AIWROK苹果系统找图方法完整示例集合
信息发布软件苹果系统找图方法完整示例集合
苹果系统找图方法完整示例集合
信息发布软件苹果IOS系统找字OCR方法例子
苹果IOS系统找字OCR方法例子
信息发布软件AIWORK软件数组高级示例
AIWORK软件数组高级示例
信息发布软件AIWROK软件运算符封装库示例
AIWROK软件运算符封装库示例
信息发布软件AIWROK软件语法运行小示例
AIWROK软件语法运行小示例
信息发布软件AIWROK软件JS循环小示例
AIWROK软件JS循环小示例
信息发布软件AIWROK软件H5网页被主脚本获取值用法
AIWROK软件H5网页被主脚本获取值用法
信息发布软件AIWROK软件创建可暂停恢复的多线程任务
AIWROK软件创建可暂停恢复的多线程任务
信息发布软件AIWROK软件类型转换方法例子
AIWROK软件类型转换方法例子
信息发布软件AIWROK软件H5脚本执行与进度显示
AIWROK软件H5脚本执行与进度显示 .
信息发布软件AIWROK软件根据时间段执行异步任务支持多线程并行处理
AIWROK软件根据时间段执行异步任务支持多线程并行处理
信息发布软件H5自动开关执行脚本功能演示
H5自动开关执行脚本功能演示
信息发布软件AIWROK软件H5单选脚本运行示例
AIWROK软件H5单选脚本运行示例
信息发布软件H5任务脚本选择与执行中心
H5任务脚本选择与执行中心
信息发布软件H5里CheckBox控件演示
H5里CheckBox控件演示
信息发布软件AIWROK软件正则用法实际例子
AIWROK软件正则用法实际例子
信息发布软件AIWROK软件权限管理器实现
AIWROK软件权限管理器实现
信息发布软件AIWORK软件节点方法无碍示例子
AIWORK软件节点方法无碍示例子
信息发布软件JSON.stringify 和 JSON.parse 完整示例
JSON.stringify 和 JSON.parse 完整示例
信息发布软件AIWROK软件展示JavaScript各种语句标识符的用法
AIWROK软件展示JavaScript各种语句标识符的用法
信息发布软件JS巧妙地组合使用各种条件语句
JS巧妙地组合使用各种条件语句
信息发布软件AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
AIWROK手机数据库MySQL数据库截图片批量上传操作脚本
信息发布软件HID中文输入智能打字功能
HID中文输入智能打字功能
信息发布软件AIWROK软件对象工具函数库例子
AIWROK软件对象工具函数库例子
信息发布软件AIWROK软件H5交互演示黄色主题
AIWROK软件H5交互演示黄色主题
信息发布软件H5单按钮执行脚本示例
H5单按钮执行脚本示例
信息发布软件苹果H5界面完整调用脚本示例
苹果H5界面完整调用脚本示例
信息发布软件AIWROK软件平台设备信息全面检测工具例子
AIWROK软件平台设备信息全面检测工具例子
信息发布软件AIWROK创建和放大日志窗口并展示动态内容
AIWROK创建和放大日志窗口并展示动态内容
信息发布软件AIWROK软件device相关方法获取设备信息例子
AIWROK软件device相关方法获取设备信息例子[/backcolor]
信息发布软件数据库MySQL实时内容随机调用
数据库MySQL实时内容随机调用
信息发布软件AIWROK软件分享一个特效苹果H5页面
AIWROK软件分享一个特效苹果H5页面
信息发布软件数据库MYQ业务流程心跳程序启动
数据库MYQ业务流程心跳程序启动
信息发布软件数据库MySQL功能支持创建表插入中文数据查询删除功能例子
数据库MySQL功能支持创建表插入中文数据查询删除功能例子
信息发布软件AIWROK软件Zip 高级操作复杂示例
AIWROK软件Zip 高级操作复杂示例
信息发布软件AIWROK软件txt_文件读写方法小结
AIWROK软件txt_文件读写方法小结
信息发布软件AIWROK软件file文件操作方法小结
AIWROK软件file文件操作方法小结
信息发布软件AIWORK软件配置读写H5演示配套脚本
AIWORK软件配置读写H5演示配套脚本
信息发布软件AIWROK配置读写功能演示示例
AIWROK配置读写功能演示示例
信息发布软件AIWROK截图缓存工具
AIWROK截图缓存工具
信息发布软件AIWROK线程许可证工具
AIWROK线程许可证工具
信息发布软件整理了AIWROK环境下常用的Date对象和sleep对象方法
整理了AIWROK环境下常用的Date对象和sleep对象方法
信息发布软件FastUI界面普通用法
FastUI界面普通用法
信息发布软件FastUI界面类[window]方法小结
FastUI界面类[window]方法小结 方法 1:close(关闭指定窗口)方法 2:closeAll(关闭所有窗口)方法 3:loadUI(加载 UI 界面)方法 4:onClose(监听窗口关闭事件)方法 5:onLoad(监听窗口加载事件)方法 6:setFull(设置窗口全屏)方法 7:setHeight(设置窗口高度)方法 8:setHidden(隐藏窗口)方法 9:setLeft(设置窗口 X 轴坐标)方法 10:setTop(设置窗口 Y 轴坐标)方法 11:setVisable(显示隐藏的窗口)方
信息发布软件AIWROK软件按钮监听UI界面与事件监听功能演示
AIWROK软件按钮监听UI界面与事件监听功能演示.
信息发布软件AWIROK软件多选[uiCheckBox]方法小结
AWIROK软件多选方法小结 方法一:findByID 加载多选控件方法二:getAllChecked 获取所有选中项方法三:getAllSelect 获取所有选项方法四:getChecked 获取某个选项是否选中方法五:setChecked 设置某个选项是否选中方法六:setCheckeds 设置多个选项是否选中方法七:setHeight 设置高度
信息发布软件AIWROK日志演示开启日志显示 → 放大 → 关闭代码
AIWROK日志演示开启日志显示 → 放大 → 关闭代码
信息发布软件&#127983;AIWROK数组方法高级应用案例
🏯AIWROK数组方法高级应用案例
信息发布软件AIWROK软件日志悬浮窗简化版自动切换位置
AIWROK软件日志悬浮窗简化版自动切换位置
信息发布软件AIWROK软件String实例演示
AIWROK软件String实例演示
信息发布软件AIWROK软件S内置String类[String]方法小结
AIWROK软件S内置String类[String]方法小结 方法 1:charAt[/backcolor]方法 2:charCodeAt[/backcolor]方法 3:indexOf[/backcolor]方法 4:lastIndexOf[/backcolor]方法 5:length[/backcolor]方法 6:match[/backcolor]方法 7:replace[/backcolor]方法 8:replaceAll[/backcolor]方法 9:split[/backcolor]方法 10:startsWith[/backcolor]方法 11:substr[/backcolor]方法 12:substring[/backcolor]方法 13:trim[/backcol
信息发布软件AIWROK软件完整的WebSocket客户端示例
这段代码是一个完整的WebSocket客户端示例,用于连接到指定的WebSocket服务器并处理各种事件。具体来说,代码的作用如下: 定义服务器地址:首先定义了一个服务器的IP地址和端口号 var ip = "154.37.221.104:8886";。 创建WebSocket对象:尝试创建一个新的WebSocket对象 var ws = new WebSocket();。注意,这里的 new ws() 应该是 new WebSocket()。 添加事件监听器:代码中尝试为WebSocket对象添加事件监听器,但这里有一个错误。
信息发布软件AIWROK软件苹果系统中实现四种基本滑动操作
AIWROK软件苹果系统中实现四种基本滑动操作
信息发布软件hid的滑动没有百分比坐标滑动吗
hid的滑动没有百分比坐标滑动吗
信息发布软件单选控件[uiRadioButton]方法小结
单选控件方法小结 方法 1:加载单选控件[/backcolor]方法 2:获取选中项[/backcolor]方法 3:设置高度[/backcolor]方法 4:设置选中项[/backcolor]
信息发布软件AIWROK软件无障碍触摸操作示例:点击、左右滑动、上下滑动实例
AIWROK软件无障碍触摸操作示例:点击、左右滑动、上下滑动实例
信息发布软件AIWROK软件安卓随机工具应用函数生成
AIWROK软件安卓随机工具应用函数生成
信息发布软件用在AIWORK软件代码中的实用符号分类整理2
用在AIWORK软件代码中的实用符号分类整理2 软件IDE用Emoji符号分类整理(含用途说明)一、表情与情感1. 微笑 [*]😀 笑脸(基础开心反馈,用于操作成功后的友好提示) [*]😃 笑脸大眼睛(强化开心情绪,用于重要任务完成后的积极反馈) [*]😄 笑脸和微笑的眼睛(温和友好的状态,用于日常交互中的正向回应) [*]😁 带着微笑的眼睛(轻松愉悦的反馈,用于轻度成功或趣味操作) [*]
信息发布软件AIWROK软件图像二值化的各种方法和应用场景
AIWROK软件图像二值化的各种方法和应用场景

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2026-2-6 13:34 , Processed in 0.421365 second(s), 58 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表