VB代码VB小程序:将彩色图像转变为黑白图像
- 格式:docx
- 大小:12.04 KB
- 文档页数:5
VBA中常见的图像处理与操作技巧图像处理在许多领域都占据着重要的地位,尤其在数字化时代,它更是无处不在。
在VBA(Visual Basic for Applications)中,我们可以利用一些技巧和方法来处理和操作图像。
本文将介绍一些常见的VBA图像处理与操作技巧,帮助您更好地利用VBA来处理和操作图像。
一、图像导入和导出在VBA中,我们可以使用一些方法来导入和导出图像。
通过导入图像,我们可以从本地文件或网络上将图像加载到VBA中进行处理。
使用导出图像的技巧,我们可以将处理后的图像保存到本地文件或上传到网站。
以下是几个常用的示例代码:1.1 导入图像:```Sub ImportImage()Dim pic As PictureSet pic = ActiveSheet.Pictures.Insert("C:\image.jpg")'根据需要进行图像处理End Sub```1.2 导出图像:```Sub ExportImage()Dim pic As PictureSet pic = ActiveSheet.Pictures(1)pic.CopyWith New Chart.Paste.Export Filename:="C:\output.png", Filtername:="PNG"'根据需要进行其他操作End WithApplication.CutCopyMode = FalseEnd Sub```二、图像大小调整在VBA中,我们可以使用一些方法来调整图像的大小。
这对于在处理图像时调整其尺寸非常有用。
以下是几个示例代码:2.1 等比例调整图像大小:```Sub ResizeImage()Dim pic As PictureSet pic = ActiveSheet.Pictures(1)With pic.ShapeRange.LockAspectRatio = msoFalse.ShapeRange.Width = 200.ShapeRange.Height = 150End WithEnd Sub```2.2 按比例调整图像大小:```Sub ResizeImageProportionally()Dim pic As PictureSet pic = ActiveSheet.Pictures(1)With pic.ShapeRange.LockAspectRatio = msoTrue.ShapeRange.Width = .ShapeRange.Width * 1.5 .ShapeRange.Height = .ShapeRange.Height * 1.5End WithEnd Sub```三、图像裁剪在VBA中,我们可以使用一些方法来裁剪图像。
vb代码-颜色渐变的标题栏(VB code - color gradient title bar)'a gradual change in the title box, in this case we can see the application skills of drawingEspecially the method of realizing gradient, it is worth us to draw lessons from'it also involves dragging the untitled windowOption ExplicitPrivate IsMaximized As BooleanPrivate IsMinimized As BooleanPrivate ButtonsCount As IntegerPrivate Sub Form_Paint ()ReSizeEndFRDrag Me.Top, Me.LeftEnd SubPrivate Sub imgCloseForm_MouseDown (Button, As, Shift, As, x, As, y, As, Single, Integer, Single, Integer)ImgCloseForm.Picture = imgCloseFormButtonDown.PictureEnd SubPrivate Sub imgCloseForm_MouseUp (Button, As, Shift, As, x, As, y, As, Single, Integer, Single, Integer)'Unload All of the FormsDim frm As FormImgCloseForm.Picture = imgCloseFormButton.PictureFor Each frm In FormsUnload FRMNext FRMEndEnd SubPrivate Sub imgMaximize_MouseDown (Button, As, Shift, As, x, As, y, As, Single, Integer, Single, Integer)If IsMaximized = True ThenImgMaximize.Picture = imgNormalizeButtonDown.PictureElseImgMaximize.Picture = imgMaximizeButtonDown.PictureEnd IfEnd SubPrivate Sub imgMaximize_MouseUp (Button, As, Shift, As, x, As, y, As, Single, Integer, Single, Integer)If IsMaximized = False ThenMe.WindowState = 2IsMaximized = TrueForm_ResizeImgMaximize.Picture = imgNormalizeButton.PictureElseMe.WindowState = 0IsMaximized = FalseForm_ResizeImgMaximize.Picture = imgMaximizeButton.PictureEnd IfEnd SubPrivate Sub imgMinimize_MouseDown (Button, As, Shift, As, x, As, y, As, Single, Integer, Single, Integer)ImgMinimize.Picture = imgMinimizeButtonDown.PictureEnd SubPrivate Sub imgMinimize_MouseUp (Button, As, Shift, As, x, As, y, As, Single, Integer, Single, Integer)If IsMinimized = False ThenMe.WindowState = 1IsMinimized = TrueForm_ResizeImgMinimize.Picture = imgMinimizeButton.PictureElseMe.WindowState = 0IsMinimized = FalseForm_ResizeImgMinimize.Picture = imgMinimizeButton.PictureEnd IfEnd SubPrivate Sub Form_Activate ()IsMinimized = FalseEnd SubPrivate Sub Form_Load ()Dim frameHeight As LongDim frameWidth As LongMe.ScaleMode = 3''compute the width of the left and right dialog frame FrameHeight = GetSystemMetrics (SM_CYDLGFRAME) * 2''compute the width of the top and bottom dialog frame FrameWidth = GetSystemMetrics (SM_CXDLGFRAME) * 2me.scalemode = 1buttonscount = 0如果Me.MaxButton真的那么buttonscount = buttonscount + 1如果Me.MinButton真的那么buttonscount = buttonscount + 2 选择案例buttonscount案例0imgmaximize可视=假。
VB编程真彩色转为灰度图像源码'以下代码请贴在一个新建的Cimage类中Option ExplicitPrivate Type BITMAPFILEHEADERbfType As IntegerbfSize As LongbfReserved1 As IntegerbfReserved2 As IntegerbfOffBits As LongEnd TypePrivate Type BITMAPINFOHEADERbiSize As LongbiWidth As LongbiHeight As LongbiPlanes As IntegerbiBitCount As IntegerbiCompression As LongbiSizeImage As LongbiXPelsPerMeter As LongbiYPelsPerMeter As LongbiClrUsed As LongbiClrImportant As Long End TypePrivate Type bitmapbmType As LongbmWidth As LongbmHeight As LongbmWidthBytes As LongbmPlanes As IntegerbmBitsPixel As IntegerBmBits As Long End TypePrivate Type RGBQUADBlue As ByteGreen As ByteRed As ByteReserved As ByteEnd TypePrivate Type BITMAPINFObmiHeader As BITMAPINFOHEADERbmiColors As RGBQUADEnd TypePrivate Const BI_bitfields = 3& '带掩码的Private Const BI_RGB = 0 '正常Private Const DIB_RGB_COLORS = 0 '真彩色Private Const OBJ_BITMAP = 7 '位图对象Private Const SRCCOPY = &HCC0020 '直接拷贝Private Const IMAGE_BITMAP = 0 'LoadImage函数的载入类型,位图Private Const LR_LOADFROMFILE = &H10 '从文件载入Private Const LR_CREATEDIBSECTION = &H2000 '如果指定了IMAGE_BITMAP,就返回DIBSection的句柄,而不是位图的句柄Private Const STRETCH_ANDSCANS = 1 '默认设置。
(一):彩色图像转灰度图1、设计任务1) 读入彩色和灰度图像并显示;2) 对彩色图像转化为灰度图像并显示;3) 比较两种方法的效果。
2、设计目的1) 掌握彩色图转灰度图的基本原理与方法;2) 初步掌握MATLAB的使用方法;3) 了解MATLAB在数字信号处理,尤其是图像处理中显现出来的优势。
3、源代码% 把RGB格式的图片转换为YUV格式。
clear; clc;x=imread('lena512.BMP');[line,row,dim]=size(x);x1=double(x); % 数据类型转换subplot(1,3,1) % 分割当前绘图窗口为(1,3)的区域,显示此图片与1号区域imshow(uint8(x)) % 数据类型转换,并且显示当前图片title('原图');% 矩阵乘,根据【RGB】转【YUV】关系转灰度图Y1=0.299*x(:,:,1)+0.587*x(:,:,2)+0.114*x(:,:,3);y1=[round(Y1)]; % 取整subplot(1,3,2)imshow(uint8(y1))title('根据各分量转换关系转换后图片');% 求RGB各个分量均值转灰度图Y2=(x(:,:,1)+x(:,:,2)+x(:,:,3))/3;y2=[round(Y2)];subplot(1,3,3)imshow(uint8(y2))title('求均值转换后图片');图(1)彩色转灰度图程序运行结果4、结果分析由运行结果可以看出,根据RGB到YUV各个分量关系转换得到的灰度图比较真实,而用简单的求RGB各个分量的均值转弧度图,其结果很不理想,图片基本看不清楚原来的轮廓。
(二):对灰度图像实现按比例缩小和放大1、设计任务1) 对灰度图实现在行上k1=0.6,列上k2=0.75的按比例缩小;2) 对灰度图实现在行上k1=1.2,列上k2=1.5的按比例放大;2、设计目的1) 掌握图像的放大和缩小原理;2) 用MATLAB实现图像的按比例放大和缩小;3) 明白图像的放大和缩小并不是简单的互为逆过程。
VB利用API函数实现图像淡入淡出(2008-11-07 23:18:40)标签:vb api图像淡入淡出it分类:VB 一般传统的实现两个PictureBox之间图像的淡入淡出效果都需要使用大量的API函数并进行复杂的调色板以及绘图设备(Device Context)的操作。
但是在Win98、Win2000中,微软提供了支持透明图像拷贝的AlphaBlend函数。
这篇文章就介绍如何通过API函数AlphaBlend实现PictureBox之间图像的淡入淡出效果。
AlphaBle nd函数的定义在msimg32.dll中,一般Win98、Win2000都带了这个库,在编程之前你可以先察看一下该文件是否存在。
打开VB建立一个新工程。
选择菜单 Project | Add Module 添加一个模块到工程中,在其中输入以下代码:Public Type rBlendPropstBlendOp As BytetBlendOptions As BytetBlendAmount As BytetAlphaType As ByteEnd TypePublic Declare Function AlphaBlend Lib "msimg32" (ByVal hDestDC As Long, _ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _ByVal nHeight As Long, ByVal hSrcDC As Long, _ByVal xSrc As Long, ByVal ySrc As Long, ByVal widthSrc As Long, _ByVal heightSrc As Long, ByVal blendFunct As Long) As BooleanPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _(Destination As Any, Source As Any, ByVal Length As Long)大家可以看到,AlphaBlend函数的定义同普通的复制函数Bitblt很相似,只是最后的参数blendFun ct定义为一个rBlendProps结构。
用VB编程处理图像的方法摘要主要阐述在图形处理的过程中, 对于常见的图形的柔化、锐化、浮雕、扩散等的处理方法。
关键词VB编程;图像;处理方法在一般的图形处理的过程中,常见的方法有图形的柔化、锐化、浮雕、扩散等处理方法,下面我们介绍每一个算法的工作方法以及它在VB中实现的方法。
首先要在VB6.0当中建立一个工程,建立一个窗体Form 1和一个模块Module 1。
在窗体Form 1中添加公共对话框控件和Picture控件,Common dialog 1,cmdLoad,cmdSmooth,cmdSharpen,cmd Emboss,cmdDif fuse以及cmdEnd 六个命令的按钮。
1 读取图形象素值首先设置好了存放象素值的数组Picture Pixels(),声明如下:Global Picture Pixels(2,500,500)As Integer 处理图形尺寸不超过500×500读取图形的象素到Picture Pixels()数组一共有两种方法:①用Point方法;②直接从文件中读取象素。
后一种方法在处理图形时速度相对快一些,但是该方法需要事先去了解不同的图形文件的结构,需要提供出不同处理的程序。
而采用Point方法则可以直接的从图形框中读取图型象素值。
以下的示例采用的Point 方法。
在执行cmdLoad的命令时,程序要调用公共对话框,然后让用户来选择图形的文件,再将图形装入图形框中。
图形框的Scale Mode 属性可以设置为3(象素);Auto Size 属性可以设置为T rue,所以能够从图形框的尺寸中求出图形的尺寸。
假如其中的一个图形的尺寸超过了500,则程序会出现出错信息并且结束,否则则通过Point方法读出象素并且取出三元色饱和度的值放入Picture Pixels的三维数组中。
数组的第一下标0表示红,1表示绿,2表示蓝;第二下标对应于象素的列;第三下标对应于象素的行。
VBA中的图像处理技巧和函数介绍VBA(Visual Basic for Applications)是一种非常强大的编程语言,可以在Microsoft Office应用程序(如Excel、Word和PowerPoint)中进行自动化操作和定制化编程。
在VBA中,图像处理是一个常见和重要的任务,它可以帮助我们对图像进行编辑、操作和分析。
本文将介绍一些VBA 中常用的图像处理技巧和函数,以帮助您更好地处理图像任务。
1. 插入和调整图片在VBA中,可以使用`Shapes`对象的`AddPicture`方法来插入图片。
例如,以下代码将插入一个名为"image.jpg"的图片到工作表的A1单元格位置:```VBAActiveSheet.Shapes.AddPicture "C:\image.jpg", msoFalse, msoTrue, Range("A1").Left, Range("A1").Top, -1, -1```使用`Left`和`Top`属性可以调整图片的位置,使用`Width`和`Height`属性可以调整图片的大小。
2. 裁剪图片VBA提供了`PictureFormat`对象来进行图片的裁剪操作。
例如,以下代码将裁剪A1单元格位置处的图片,使其宽度剩下原来的一半:```VBAActiveSheet.Shapes.Range(Array("Picture1")).PictureFormat.CropLeft = Range("A1").Width / 2```可以使用其他类似的属性如`CropTop`、`CropRight`和`CropBottom`来调整图片的其他部分。
3. 调整亮度和对比度通过调整图片的亮度和对比度,可以改变图像的整体明暗和色彩鲜艳度。
在VBA中,可以使用`AdjustBrightness`和`AdjustContrast`方法来实现。
Option Base 1Dim p(1 To 4, 1 To 2) As Single '定义四边形的四个顶点的坐标数组Dim ch(1 To 2, 1 To 2) As Single '定义四边形变换矩阵坐标数组Private Sub Comd画图_Click()Dim n, i, j As Integern = 1 '初始化p数组For i = 1 To 4For j = 1 To 2p(i, j) = Val(Text1(n).Text)n = n + 1Next jNext iPicture1.DrawWidth = 2Picture1.DrawStyle = 0Picture1.Line (p(1, 1), p(1, 2))-(p(2, 1), p(2, 2)) '画出图形Picture1.Line (p(2, 1), p(2, 2))-(p(3, 1), p(3, 2))Picture1.Line (p(3, 1), p(3, 2))-(p(4, 1), p(4, 2))Picture1.Line (p(4, 1), p(4, 2))-(p(1, 1), p(1, 2))Comd画图.Enabled = FalseEnd SubPrivate Sub Comd开始_Click()MsgBox "请输入图形坐标值(-100~100),按“确定”返回", vbInformation, "提示信息"For n = 1 To 8Text1(n).Locked = Falsen = n + 1Next nText1(1).SetFocusComd画图.Enabled = TrueComd清除.Enabled = TrueComd结束.Enabled = TrueEnd SubPrivate Sub Comd结束_Click()EndEnd SubPrivate Sub Comd清除_Click()Picture1.Picture = LoadPicture("")Picture1.Scale (-110, 110)-(110, -110) '建立用户坐标系Picture1.AutoRedraw = TruePicture1.DrawWidth = 1Picture1.DrawStyle = 3Picture1.Line (-100, 0)-(100, 0) '用点划线画x坐标轴Picture1.Line (0, -100)-(0, 100) '用点划线画y坐标轴End SubPrivate Sub Command2_Click() '比例变换Dim c(1 To 4, 1 To 2) As Singlech(1, 1) = Val(Text2.Text) '比例变换因子ch(2, 2) = Val(Text3.Text)Label8.Caption = ch(1, 1) & Space(2) & ch(1, 2) & vbCrLf '输出变换矩阵Label8.Caption = Label8.Caption & vbCrLfLabel8.Caption = Label8.Caption & ch(2, 1) & Space(2) & ch(2, 2) & vbCrLfFor i = 1 To 4 '矩阵相乘For j = 1 To 2c(i, j) = p(i, 1) * ch(1, j) + p(i, 2) * ch(2, j)Next jNext iPicture1.Picture = LoadPicture("") '清除界面图形,恢复最初界面Picture1.Scale (-110, 110)-(110, -110)Picture1.AutoRedraw = TruePicture1.DrawWidth = 1Picture1.DrawStyle = 3Picture1.Line (-100, 0)-(100, 0)Picture1.Line (0, -100)-(0, 100)Picture1.DrawWidth = 2 '变换后的线型设置Picture1.DrawStyle = 0Picture1.Line (c(1, 1), c(1, 2))-(c(2, 1), c(2, 2)), RGB(255, 0, 0) '绘出变换后的图形Picture1.Line (c(2, 1), c(2, 2))-(c(3, 1), c(3, 2)), RGB(255, 0, 0)Picture1.Line (c(3, 1), c(3, 2))-(c(4, 1), c(4, 2)), RGB(255, 0, 0)Picture1.Line (c(4, 1), c(4, 2))-(c(1, 1), c(1, 2)), RGB(255, 0, 0)For i = 1 To 4For j = 1 To 2If c(i, j) > 110 Or c(i, j) < -110 ThenMsgBox "输入的比例因子过大,超过屏幕显示的区域,请重新输入", vbExclamation, "提示信息"End IfNext jNext iComd开始.Enabled = False: Comd画图.Enabled = False: Comd清除.Enabled = True: Comd 结束.Enabled = True: Command2.Enabled = False: Command3.Enabled = FalseEnd SubPrivate Sub Command3_Click() '旋转变换pi = 3.14159Dim c(1 To 4, 1 To 2) As Singlealpha = Val(Text4.Text) '旋转变换因子ch(1, 1) = Cos(alpha * pi / 180)ch(1, 2) = Sin(alpha * pi / 180)ch(2, 1) = -Sin(alpha * pi / 180)ch(2, 2) = Cos(alpha * pi / 180)Label9.Caption = Space(1) & "cos" & alpha & "°" & Space(2) & "sin" & alpha & "°" & vbCrLf '输出变换矩阵Label9.Caption = Label9.Caption & vbCrLfLabel9.Caption = Label9.Caption & "-sin" & alpha & "°" & Space(2) & "cos" & alpha & "°" & vbCrLfFor i = 1 To 4 '矩阵相乘For j = 1 To 2c(i, j) = p(i, 1) * ch(1, j) + p(i, 2) * ch(2, j)Next jNext iPicture1.Picture = LoadPicture("") '清除界面图形,恢复最初界面Picture1.Scale (-110, 110)-(110, -110)Picture1.AutoRedraw = TruePicture1.DrawWidth = 1Picture1.DrawStyle = 3Picture1.Line (-100, 0)-(100, 0)Picture1.Line (0, -100)-(0, 100)Picture1.DrawWidth = 2 '变换后的线型设置Picture1.DrawStyle = 0Picture1.Line (c(1, 1), c(1, 2))-(c(2, 1), c(2, 2)), RGB(0, 0, 255) '绘出变换后的图形Picture1.Line (c(2, 1), c(2, 2))-(c(3, 1), c(3, 2)), RGB(0, 0, 255)Picture1.Line (c(3, 1), c(3, 2))-(c(4, 1), c(4, 2)), RGB(0, 0, 255)Picture1.Line (c(4, 1), c(4, 2))-(c(1, 1), c(1, 2)), RGB(0, 0, 255)Comd开始.Enabled = False: Comd画图.Enabled = False: Comd清除.Enabled = True: Comd 结束.Enabled = True: Command2.Enabled = False: Command3.Enabled = FalseEnd SubPrivate Sub Form_Load()Picture1.Picture = LoadPicture("")Picture1.Scale (-110, 110)-(110, -110) '建立用户坐标系Picture1.AutoRedraw = TruePicture1.DrawWidth = 1Picture1.DrawStyle = 3Picture1.Line (-100, 0)-(100, 0) '用点划线画x坐标轴Picture1.Line (0, -100)-(0, 100) '用点划线画y坐标轴ch(1, 1) = 1ch(1, 2) = 0ch(2, 1) = 0ch(2, 2) = 1For n = 1 To 8Text1(n).Locked = Truen = n + 1Next nComd开始.Enabled = True: Comd画图.Enabled = False: Comd结束.Enabled = False: Comd 清除.Enabled = False: Command2.Enabled = False: Command3.Enabled = FalseEnd SubPrivate Sub Text1_Change(Index As Integer) '输入原始坐标Comd开始.Enabled = False: Comd画图.Enabled = True: Comd清除.Enabled = True: Comd 结束.Enabled = True: Command2.Enabled = False: Command3.Enabled = False End SubPrivate Sub Text2_Change() '修改比例变换参数Comd开始.Enabled = False: Comd画图.Enabled = False: Comd清除.Enabled = False: Comd 结束.Enabled = True: Command2.Enabled = True: Command3.Enabled = FalseEnd SubPrivate Sub Text3_Change() '修改比例变换参数Comd开始.Enabled = False: Comd画图.Enabled = False: Comd清除.Enabled = False: Comd结束.Enabled = True: Command2.Enabled = True: Command3.Enabled = FalseEnd SubPrivate Sub Text4_Change() '修改旋转变换参数Comd开始.Enabled = False: Comd画图.Enabled = False: Comd清除.Enabled = False: Comd 结束.Enabled = True: Command2.Enabled = False: Command3.Enabled = TrueEnd Sub。
图片的黑白处理(二值化)原始圖片黑白處理后圖片原始圖片:黑白處理后圖片:部分处理代码: code……Dim ts2 As IThresholder = New GlobalMeanThreshold(inbmp)Dim tsBMP As New Bitmap(PictureBox1.Width, PictureBox1.Height) ts2.RenderToBitmap(tsBMP)PictureBox6.Image = tsBMPPictureBox6.Height = PictureBox1.HeightPictureBox6.Width = PictureBox1.WidthPictureBox6.Left = 0PictureBox6.Top = 0……理论知识:灰度图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。
即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。
在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。
为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。
所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。
如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。
如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。
VB编程真彩色转为灰度图像源码'以下代码请贴在一个新建的Cimage类中Option ExplicitPrivate Type BITMAPFILEHEADERbfType As IntegerbfSize As LongbfReserved1 As IntegerbfReserved2 As IntegerbfOffBits As LongEnd TypePrivate Type BITMAPINFOHEADERbiSize As LongbiWidth As LongbiHeight As LongbiPlanes As IntegerbiBitCount As IntegerbiCompression As LongbiSizeImage As LongbiXPelsPerMeter As LongbiYPelsPerMeter As LongbiClrUsed As LongbiClrImportant As Long End TypePrivate Type bitmapbmType As LongbmWidth As LongbmHeight As LongbmWidthBytes As LongbmPlanes As IntegerbmBitsPixel As IntegerBmBits As Long End TypePrivate Type RGBQUADBlue As ByteGreen As ByteRed As ByteReserved As ByteEnd TypePrivate Type BITMAPINFObmiHeader As BITMAPINFOHEADERbmiColors As RGBQUADEnd TypePrivate Const BI_bitfields = 3& '带掩码的Private Const BI_RGB = 0 '正常Private Const DIB_RGB_COLORS = 0 '真彩色Private Const OBJ_BITMAP = 7 '位图对象Private Const SRCCOPY = &HCC0020 '直接拷贝Private Const IMAGE_BITMAP = 0 'LoadImage函数的载入类型,位图Private Const LR_LOADFROMFILE = &H10 '从文件载入Private Const LR_CREATEDIBSECTION = &H2000 '如果指定了IMAGE_BITMAP,就返回DIBSection的句柄,而不是位图的句柄Private Const STRETCH_ANDSCANS = 1 '默认设置。
本文讲述用灰度直方图均衡来调整图像的色彩空间的方法前几次为大家讲述了如何通过操作像素来实现一些简单的滤镜效果。
这次想更大家讲述一下用灰度直方图均衡来调整图像的色彩空间。
先给大家介绍一下一些颜色的小常识。
以电脑的颜色来说,颜色的组成是右红、绿、蓝三种颜色组成。
以最容易的24位色来说,红色、绿色、蓝色各用1个字节来表示,1个字节有8位,所以加在一起正好是24位。
由于电脑无法用连续的模拟值来表示一个自然量,只能将它们分成一段一段来显示,分得越多就越接近自然。
1个字节是2^8=256,所以在24位色中每一个单色都有256种不同的强度,三种颜色按照不同的强度混合,可以得到2^24种色彩。
大约可以表达1677万种色彩,对于人的眼睛来说已经和自然色彩没有区别了。
如果我们用PHOTOSHOP来打开一张图片,选择LEVEL工具,就可以察看这张图片的色彩分布了。
原图:灰度通道:红色通道:绿色通道:蓝色通道:由上面的四个通道图,我们可以发现,这张图片的色彩都是以低亮度为主,红绿蓝三色在高亮度区域的分布都很少,而灰度通道也表明整张图片的亮度值很低。
在前面的文章中,我已经和大家讲过,人眼对于灰度(亮度)的敏感程度最高。
因此,如果我们能通过一种方法把这章图片的灰度提高,那么它在我们的视觉中就会有更好的表现。
或许有朋友说只要把图片加亮度,不是就可以了吗?不错,通过提高所有色彩的亮度,可以把原来处于第亮区域的色彩转移到中亮度或高亮度区域,但是大家也知道,在算法中,加亮度只是很简单的在R、G、B三个值后面直接加上一个偏移量:NewRed=OldRed+Offset,NewGreen=OldGreen+Offset,NewBlue+Offset,但是这种做法只是“粗暴”地将整个色彩空间搬了一个位置,而没有改变其分布。
请看下面,我在这张图片加上了120点亮度:再看看此时的色彩分布你就知道我为什么说它“粗暴”了。
灰度通道:红色通道:绿色通道:蓝色通道:可以看到,原图上的高亮度部分的色彩信息全部丢失,而低亮度部分(0-120)则是一片空白,如果说原来的图片是2^8×2^8×2^8 一共1677万色的话,那么现在的图片则是:(256-120)^3=251万色,也就是说,通过我们给图片加了120点的亮度,我们丢失了一大半的颜色信息。
VB小程序VB代码:将图片保存或转变为JPG格式当前位置: > VB小程序1-99 > 将图片保存或转变为 JPG 格式12. 将图片保存或转变为JPG格式本人原创,转载请注明出处:/100bd/blog/item/18d7448addbb9519c9fc7a1a.html'函数 SavePicToFile 把图象保存为 JPG、TIFF、PNG、GIF、BMP 格式。
成功返回空字符串,失败返回错误信息。
'需要在窗体放置控件:Command1,Picture1,Text1' '以下代码在 VB6 调试通过。
Private Type GUIDData1 As LongData2 As IntegerData3 As IntegerData4(0 To 7) As ByteEnd TypePrivate Type GdiplusStartupInputGdiplusVersion As LongDebugEventCallback As LongSuppressBackgroundThread As LongSuppressExternalCodecs As LongEnd TypePrivate Type EncoderParameternGUID As GUIDNumberOfValues As LongType As LongValue As LongEnd TypePrivate Type EncoderParametersCount As LongParameter As EncoderParameterEnd TypeEnum PicTypep_BMPp_JPGp_GIFp_PNGp_TIFFEnd EnumPrivate Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputb uf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As LongPrivate Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Lon g) As LongPrivate Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByV al hbm As Long, ByVal hPal As Long, BITMAP As Long) As LongPrivate Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Lo ng) As LongPrivate Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal FileName As Long, clsidEncoder As GUID, encoderParams As Any) As LongPrivate Declare Function CLSIDFromString Lib "ole32" (ByVal Str As Long, id A s GUID) As LongPrivate Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveM emory" (Dest As Any, Src As Any, ByVal cb As Long) As LongPublic Function SavePicToFile(ByVal nPic As StdPicture, ByVal FileName As String, _Optional ByVal nType As PicType = p_JPG, Optional ByVal Quality As Byte = 80, _Optional ByVal TIFF_ColorDepth As Long = 24, Optional ByVal TIFF_Compression As Lo ng = 6) As String'功能:把图象保存为 BMP、JPG、GIF、PNG、TIFF 格式。
VBA中图像处理的基本方法图像处理在计算机科学和计算机视觉领域中具有重要的地位。
它通过对图像进行各种操作,从而改变图像的外观和特征。
在VBA(Visual Basic for Applications)中,我们可以利用一些基本方法来实现图像处理。
本文将介绍一些常用的VBA图像处理方法,以帮助读者更好地理解和使用VBA进行图像处理。
1. 图像的载入在进行图像处理之前,首先需要将图像加载到VBA中进行操作。
VBA提供了LoadPicture函数来实现图像的加载。
通过指定图像文件的路径,我们可以将图片读取到一个对象变量中,以便后续操作。
例如,以下代码将一个名为"image.jpg"的图像载入到VBA中:```vbaDim img As ObjectSet img = LoadPicture("C:\path\to\image.jpg")```2. 图像的显示载入图像后,可以将其显示在VBA的用户界面上,以便进行后续的处理。
VBA提供了PictureBox控件实现图像的显示。
通过设置PictureBox的Picture属性,我们可以将载入的图像展示出来。
例如,以下代码将载入的图像显示在名为"PictureBox1"的PictureBox控件上:```vbaPictureBox1.Picture = img```3. 图像的尺寸调整在进行图像处理时,有时需要调整图像的尺寸以适应特定需求。
VBA提供了一些方法来实现图像的尺寸调整。
其中一种常用的方法是使用PictureBox控件的AutoSize属性。
通过将AutoSize属性设置为True,可以自动调整PictureBox的大小以适应载入图像的尺寸。
例如,以下代码将自动调整PictureBox1的大小以适应载入图像的尺寸:```vbaPictureBox1.AutoSize = True```4. 图像的裁剪图像裁剪是一种常见的图像处理操作,可以通过剪切图像的部分区域来获取感兴趣的内容。
图形的切换在有关于多媒体的应⽤中是经常见到的。
常见的切换⽅式可以概括为以下⼏种。
切换(Cut):当前图象快速的被另⼀幅图象所取代 淡⼊(Fade In):当前图象缓缓变⿊⾄消失 淡出(Fade Out):⼀幅图象缓缓的从⿊⾊的屏幕中出现 隐现(Dissolve):⼀幅图象缓缓的变为另⼀幅图象 滑⼊(Wipe):⼀幅图象逐渐穿过并覆盖当前图象 拉进(Slide):⼀幅图象从屏幕⼀边匀速滑⼊ 弹进弹出(Pop on/off):⼀幅图象⽴即出现或消失 上拉下拉(Pull Down/Up):⼀幅图象象窗帘⼀样从屏幕项部拉下,并以相同⽅式返回 翻转(Flip):当前图象翻转,在其反⾯显⽰另⼀图象 旋转(Spin):图象以旋转⽅式出现 VB和Windows API为⽣成切换效果提供了有⼒的⼯具。
图形切换的实质是通过快速组合或拷贝来建⽴分离的图象。
在某些情况下,建⽴切换效果只不过将当前图象的属性由Visible转变True,如上述效果中的弹进弹出、切换等,⽽多数情况下,切换效果需要调⽤Windows的GDI函数来完成。
图形的切换和弹进弹出是最容易实现的例⼦,前⾯已经解释过这两种切换效果的含义了。
在Form中拉出Image1和Image2,注意,Image1和Image2的坐标和⼤⼩应完全⼀样。
并设置好事先准备好的两幅图形。
将Image1的Visible设为True,再将Image2的Visible设为false,双击Form,输⼊如下程序代码: Private Sub Form_Click() Image1.Visible=False Image2.Visible=True End Sub 在程序运⾏时,应只能看到Image1。
这时,点击⿏标,即可看Image1快速的被Image2所代替。
形成图形的切换效果。
这时再将Image1和Image2的坐标错开,不要让两个图形有重叠部分。
这时再运⾏程序,点击⿏标,Image1消失的同时,Image2在另⼀个地⽅出现。
Private Declare Function GetPixel Lib "GDI32" (ByV al hDC As Long, ByV al nxpos As Long, ByV al nypos As Long) As LongPrivate Declare Function SetPixel Lib "GDI32" (ByV al hDC As Long, ByV al X As Long, ByV al Y As Long, ByV al colorref As Long) As LongPublic Selectx1Public Selecty1Public Selectx2Public Selecty2Public Quchu_Beijin As LongPublic Function large(ByV al a, ByV al b)large = aIf a > b Then large = aIf b > a Then large = bEnd Function'图像显示属性,短的设定Public Function small(ByV al a, ByV al b)small = aIf a < b Then small = aIf b < a Then small = bEnd FunctionPrivate Sub Command1_Click()'bel1.Caption = "反色操作"chu_li ("fanse")End SubPublic Sub chu_li(suan_fa$)Dim xxx, xwidth, yyy, yheight, maxval, ly, curval, hh, xx, yyDim c1, c2, r1, g1, b1, r2, g2, b2, rr, gg, bb, void, setr1, setg1, setb1setr1 = (Quchu_Beijin And &HFF)setg1 = (Quchu_Beijin And 65280) / 256setb1 = (Quchu_Beijin And &HFF0000) / 65536'Screen.MousePointer = 11Picture1.PaintPicture Form1.Picture1.Image, 0, 0, , , 0, 0, Form1.Picture1.Width, Form1.Picture1.Height, &HCC0020'Form6.Visible = TrueIf Selected = 1 Thenxxx = small(Selectx1, Selectx2)xwidth = Abs(Selectx2 - Selectx1)yyy = small(Selecty1, Selecty2)yheight = Abs(Selecty2 - Selecty1)maxval = xwidth + 1ly = large(Selecty1, Selecty2)'Form6.HScroll1.Max = maxvalcurval = 0hh = Int(maxval / 30) + 1For xx = xxx To large(Selectx1, Selectx2)For yy = yyy To ly''''''''''''''''''''''''''''''Select Case suan_fa$Case "fanse"c1 = GetPixel(Form5.Picture1.hDC, xx, yy)r1 = (c1 And &HFF)g1 = (c1 And 65280) / 256b1 = (c1 And &HFF0000) / 65536rr = 256 - r1gg = 256 - g1bb = 256 - b1void = SetPixel(Form1.Picture1.hDC, xx, yy, RGB(rr, gg, bb))End Select'''''''''''''''''''''''''''''''Next yycurval = curval + 1If curval / hh = Int(curval / hh) Then Form6.HScroll1.V alue = curvalNext xxForm1.Picture1.RefreshEnd IfIf Selected = 0 Thenmaxval = Form1.Picture1.Width + 1hh = Int(maxval / 30) + 1ly = Form1.Picture1.Height'Form6.HScroll1.Max = maxvalcurval = 0For xx = 1 To Form1.Picture1.WidthFor yy = 1 To ly''''''''''''''''Select Case suan_fa$Case "fanse"c1 = GetPixel(Picture1.hDC, xx, yy)r1 = (c1 And &HFF)g1 = (c1 And 65280) / 256b1 = (c1 And &HFF0000) / 65536rr = 256 - r1gg = 256 - g1bb = 256 - b1void = SetPixel(Form1.Picture1.hDC, xx, yy, RGB(rr, gg, bb))End Select''''''''''''''''''Next yycurval = curval + 1'If curval / hh = Int(curval / hh) Then Form6.HScroll1.V alue = curval Next xxForm1.Picture1.RefreshEnd IfForm6.V isible = FalseScreen.MousePointer = 0End Sub。
VB代码VB小程序:将彩色图像转变为黑白图像本程序使用两种方法将一幅彩色图像转变为黑白图像:用 API 方法、用 VB 控件方法。
通过比较两种方法不难发现:用 VB 控件进行转换,过程直观,代码好理解,对学习和理解 VB 绘图语句很有帮助,但速度慢。
用 API 方法进行转换,需操作二进制数组,像素点的行列定位较复杂,但转换速度快,几乎是瞬间就完成了转换。
' '以下是窗体代码,在 VB6 调试通过'需在窗体放置 5 个控件:Command1、Command2、Command3、Picture1、Text1'本人原创,转载请注明文章来源:/100bd/blog/item/1f4653397c5d693296ddd800.htmlDim ctExit As BooleanPrivate Type BitMapbmType As Long '图像类型:0 表示是位图bmWidth As Long '图像宽度(像素)bmHeight As Long '图像高度(像素)bmWidthBytes As Long '每一行图像的字节数bmPlanes As Integer '图像的图层数bmBitsPixel As Integer '图像的位数bmBits As Long '位图的内存指针End TypePrivate Declare Function GetObject Lib "gdi32" Alias"GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As LongPrivate Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As LongPrivate Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As LongPrivate Sub Form_Load()Me.Caption = "转变为黑白图片"Text1.Text = App.Path & "\Tu1.jpg"Command1.Caption = "打开": Command1.ToolTipText = "打开指定的图片文件"Command2.Caption = "转换1": Command2.ToolTipText = "用 API 方法转变为黑白图片"Command3.Caption = "转换2": Command3.ToolTipText = "用 VB 控件方法转换为黑白图像"Picture1.AutoSize = True: Picture1.AutoRedraw = TruePicture1.ScaleMode = 3Picture1.ToolTipText = "如果已转换为黑白图像,双击恢复为原来的图像"'设置控件位置,实际可以在设计窗体时完成Dim W1 As LongW1 = Me.TextWidth("A")Command2.Move W1, W1, W1 * 6, W1 * 3Command3.Move W1 * 8, W1, W1 * 7, W1 * 3Command1.Move W1 * 15, W1, W1 * 7, W1 * 3Text1.Move W1 * 22, W1, W1 * 80, W1 * 3Picture1.Move W1, W1 * 5, W1 * 40, W1 * 40Call RndImg(Picture1) '随机画一些图像End SubPrivate Sub RndImg(Kj As Object)'随机画一些图像Dim I As LongRandomizeKj.DrawWidth = 3For I = 1 To 100Kj.Line (Kj.ScaleWidth * Rnd, Kj.ScaleHeight * Rnd)-Step(50, 50), &HFFFFFF * Rnd, BFKj.Circle (Kj.ScaleWidth * Rnd, Kj.ScaleHeight * Rnd), 30 * Rnd, &HFFFFFF * RndNextKj.DrawWidth = 1Kj.Font.Size = 24: Kj.Font.Bold = TrueKj.CurrentX = 10: Kj.CurrentY = 10: Kj.ForeColor = &H777777Kj.Print Me.CaptionKj.CurrentX = 11: Kj.CurrentY = 11: Kj.ForeColor = RGB(0, 0, 210)Kj.Print Me.CaptionKj.Picture = Kj.ImageEnd SubPrivate Sub Form_Unload(Cancel As Integer)ctExit = True '防止绘图未完成前用户关闭窗口时无法正常终止程序End SubPrivate Sub Command1_Click()'打开图片文件Dim F As StringOn Error GoTo Err1F = Trim(Text1.Text)Picture1.Picture = LoadPicture(F)Exit SubErr1:MsgBox "无法读取文件:" & vbCrLf & F, vbInformationEnd SubPrivate Sub Command2_Click()'用 API 方法转变为黑白图片Dim BMPs() As Byte, Bs As Long, Ps As Long, MapInf As BitMapDim R As Long, G As Long, B As Long, S As Long, I As LongGetObject Picture1.Image, Len(MapInf), MapInf '用 MapInf 得到 Picture1 的图像信息Ps = MapInf.bmWidthBytes \ MapInf.bmWidth '每像素字节数=行字节数\宽度Bs = MapInf.bmWidth * MapInf.bmHeight * Ps '总字节数=宽度*高度*每个像素字节ReDim BMPs(0 To Bs - 1)GetBitmapBits Picture1.Image, Bs, BMPs(0) '将 Picture1 的图像颜色值读入二进数组 BMPs()'每像素占用的字节数也可用 Ps=MapInf.bmBitsPixel\8 计算,一般为 4'第1字节为蓝色,第2字节为绿色,第3字节为红色,第4字节未使用'BMPs() 数组序号 I 与图像坐标的关系是:' X = (I Mod MapInf.bmWidthBytes) \ Ps '列序号:0 到 MapInf.bmWidth-1' Y = I \ MapInf.bmWidthBytes '行序号:0 到 MapInf.bmHeight-1'反过来,图像 X,Y 坐标处的的 RGB 颜色在数组中的序号是:' I = Y* MapInf.bmWidthBytes+X*Ps' BMPs(I+ 2),BMPs(I + 1),BMPs(I ) 的数值就是三原色红、绿、蓝For I = 0 To Bs - 1 Step PsB = BMPs(I + 2): G = BMPs(I + 1): R = BMPs(I) '红、绿、蓝S = R * 0.3 + G * 0.5 + B * 0.2 '转变为黑白灰度值,各通道颜色比例可根据不同的图片调整 BMPs(I + 2) = S: BMPs(I + 1) = S: BMPs(I) = SNextSetBitmapBits Picture1.Image, Bs, BMPs(0) '将 Picture1 的图像设置为二进数组 BMPs() End SubPrivate Sub Command3_Click()'用 VB 控件方法转换为黑白图像Dim X As Long, Y As Long, Se As Long, Ci As LongCommand1.Enabled = False: Command2.Enabled = False: Command3.Enabled = False Picture1.ClsFor X = 0 To Picture1.ScaleWidth - 1For Y = 0 To Picture1.ScaleHeight - 1Se = Picture1.Point(X, Y) '取得 x,y 坐标处像素点的颜色值Picture1.PSet (X, Y), SeBlack(Se) '设置成转换后的颜色Ci = Ci + 1If Ci > 1000 Then '因时间较长,防止出现假死状态Ci = 0: DoEventsIf ctExit Then Exit SubEnd IfNextNextCommand1.Enabled = True: Command2.Enabled = True: Command3.Enabled = True End SubPrivate Function SeBlack(Se As Long) As Long'转换为:黑白Dim R As Long, G As Long, B As Long, S As LongGetRGB Se, R, G, B '分解出三原色 R, G, BS = R * 0.3 + G * 0.5 + B * 0.2 '转变为黑白灰度值,各通道颜色比例可根据不同的图片调整 SeBlack = RGB(S, S, S)End FunctionPrivate Sub GetRGB(ByVal Se As Long, R As Long, G As Long, B As Long)'从 Se 中分解出三原色 R, G, BB = Se \ 65536: Se = Se Mod 65536G = Se \ 256: R = Se Mod 256B = B Mod 256End SubPrivate Sub Picture1_DblClick()If Command3.Enabled Then Picture1.ClsEnd Sub''本人原创,转载请注明文章来源:/100bd/blog/item/1f4653397c5d693296ddd800.html查看文档来源:/100bd/item/b5906c1592abe1051894ecc6。