- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我裁剪了一部分图像,并通过12个轨迹栏定义了2个颜色范围(H / S / L)。我还有一个“精度/速度”滑块,范围从1到10。
我需要分析多少个图像像素落入每个指定的颜色范围内。
基于精度/速度滑块,我跳过了一些行/像素。
它的工作很棒,但是太慢了。高精度(跟踪条值= 1)大约需要550毫秒。
精度低但速度快(跟踪条值= 10)时,大约需要5毫秒。
有没有办法加快此代码的速度?理想情况下,我需要将其速度提高5倍。
For y As Integer = 0 To 395
If y Mod 2 = 0 Then
startpixel = tbval / 2
Else
startpixel = 0
End If
If y Mod tbval = 0 Then
For x As Integer = 0 To 1370
If x Mod tbval - startpixel = 0 Then
analyzedpixels = analyzedpixels + 1
Dim pColor As Color = crop.GetPixel(x, y)
Dim h As Integer = pColor.GetHue
Dim s As Integer = pColor.GetSaturation * 100
Dim l As Integer = pColor.GetBrightness * 100
'verify if it is part of the first color
If h >= h1min And h <= h1max And s >= s1min And s <= s1max And l >= l1min And l <= l1max Then
color1pixels = color1pixels + 1
End If
If h >= h2min And h <= h2max And s >= s2min And s <= s2max And l >= l2min And l <= l2max Then
color2pixels = color2pixels + 1
End If
End If
Next
End If
Next
Dim rect As New Rectangle(0, 0, crop.Width, crop.Height)
Dim bdata As Imaging.BitmapData = crop.LockBits(rect, Imaging.ImageLockMode.ReadOnly, crop.PixelFormat)
Dim ptr As IntPtr = bdata.Scan0
Dim bytes As Integer = Math.Abs(bdata.Stride) * crop.Height
Dim rgbValues As Byte() = New Byte(bytes - 1) {}
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
For i As Integer = 0 To crop.Height - 1
If i Mod 2 = 0 Then
startpixel = tbval / 2
Else
startpixel = 0
End If
If i Mod tbval = 0 Then
For j As Integer = 0 To crop.Width - 1
If j Mod tbval - startpixel = 0 Then
analyzedpixels = analyzedpixels + 1
Dim position = (bdata.Stride * i) + j * 4
Dim c = Color.FromArgb(BitConverter.ToInt32(rgbValues, position))
Dim h As Integer = c.GetHue
Dim s As Integer = c.GetSaturation * 100
Dim l As Integer = c.GetBrightness * 100
If h >= h1min And h <= h1max And s >= s1min And s <= s1max And l >= l1min And l <= l1max Then
color1pixels = color1pixels + 1
End If
If h >= h2min And h <= h2max And s >= s2min And s <= s2max And l >= l2min And l <= l2max Then
color2pixels = color2pixels + 1
End If
End If
stride += 4
Next
End If
Next
crop.UnlockBits(bdata)
最佳答案
当对位图的颜色数据执行顺序操作时,Bitmap.LockBits方法可以显着提高性能,因为与连续的GetPixel / SetPixel调用相比,位图数据仅需要一次加载到内存中:每次调用都将加载一个位图数据在内存中的部分区域,然后将其丢弃,以在再次调用这些方法时重复该过程。
如果需要单次调用GetPixel / SetPixel,则这些方法可能比Bitmap.LockBits()
具有性能优势。但是,在这种情况下,实际上,性能不是一个因素。Bitmap.LockBits()
的工作方式:
这是函数调用:
public BitmapData LockBits (Rectangle rect, ImageLockMode flags, PixelFormat format);
// VB.Net
Public LockBits (rect As Rectangle, flags As ImageLockMode, format As PixelFormat) As BitmapData
rect As Rectangle
:此参数指定我们感兴趣的Bitmap数据部分;该部分的字节将被加载到内存中。它可以是位图的整个大小,也可以是它的较小部分。
flags As
ImageLockMode
:指定要执行的锁定类型。对内存的访问可以限制为读或写,或者允许并发的读/写操作。
ImageLockMode.UserInputBuffer
-
BitmapData对象由调用代码提供。
BitmapData
对象定义某些位图属性(位图的
Width
和
Height
,扫描线的宽度(
Stride
:组成单行像素的字节数,由
Bitmap.Width
的注释。
Stride
)。
IntPtr
的MSDN文档令人困惑(如果没有记错的话)。
ImageLockMode.UserInputBuffer
format As
:用于描述单个像素颜色的格式。实际上,它转换为用于表示颜色的字节数。
PixelFormat
时,每种颜色都用3个字节(RGB值)表示。使用
PixelFormat = Format24bppRgb
,每种颜色都由4个字节表示(RGB值+ Alpha)。
PixelFormat.Format32bppArgb
)指定每个字节值是
Palette条目的索引。
Format8bppIndexed
是位图信息的一部分,除非像素格式为
Palette
:在这种情况下,每个值都是系统颜色表中的一个条目。
PixelFormat.Indexed
为
PixelFormat
或
PixelFormat.Format32bppArgb
。
PixelFormat.Canonical
(也称为扫描线)表示组成一行像素的字节数。由于硬件对齐要求,它总是四舍五入到4字节边界(4的整数倍)。
Stride = [Bitmap Width] * [bytes per Color]
Stride += (Stride Mod 4) * [bytes per Color]
Stride
创建的位图的原因之一:位图的
PixelFormat.Format32bppArgb
始终已与所需边界对齐。
Stride
(每种颜色3个字节)怎么办?
PixelFormat.Format24bppRgb
乘以每像素字节数不是
Width
的倍数,则
4
将用
Stride
填充以填补空白。
0
的位图在32位和24位格式中都不会填充:
100 * 3 = 300 : 300 Mod 4 = 0 : Stride = 300
100 * 4 = 400 : 400 Mod 4 = 0 : Stride = 400
(100 x 100)
的位图将有所不同:
99 * 3 = 297 : 297 Mod 4 = 1 : Stride = 297 + ((297 Mod 4) * 3) = 300
99 * 4 = 396 : 396 Mod 4 = 0 : Stride = 396
(99 x 100)
,添加3个字节(设置为
Stride
)以填充边界。
0
的位图中位置
(98, 70)
处的像素。
[Bitmap] = new Bitmap(99, 100, PixelFormat = Format24bppRgb)
[Bytes x pixel] = Image.GetPixelFormatSize([Bitmap].PixelFormat) / 8
[Pixel] = new Point(98, 70)
[Pixel Position] = ([Pixel].Y * [BitmapData.Stride]) + ([Pixel].X * [Bytes x pixel])
[Color] = Color.FromArgb([Pixel Position] + 2, [Pixel Position] + 1, [Pixel Position])
(99 x 100)
的像素颜色将返回预期结果:
(0, 71)
的字节的值,所有字节均设置为
Stride
。
0
。
if [Position] Mod [BitmapData].Width = 0 : continue
的新位图,因此该
PixelFormat.Format32bppArgb
将始终正确对齐:
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Runtime.InteropServices
Private Function CopyTo32BitArgb(image As Image) As Bitmap
Dim imageCopy As New Bitmap(image.Width, image.Height, PixelFormat.Format32bppArgb)
imageCopy.SetResolution(image.HorizontalResolution, image.VerticalResolution)
For Each propItem As PropertyItem In image.PropertyItems
imageCopy.SetPropertyItem(propItem)
Next
Using g As Graphics = Graphics.FromImage(imageCopy)
g.DrawImage(image,
New Rectangle(0, 0, imageCopy.Width, imageCopy.Height),
New Rectangle(0, 0, image.Width, image.Height),
GraphicsUnit.Pixel)
g.Flush()
End Using
Return imageCopy
End Function
Public Function BitmapFilterSepia(source As Image) As Bitmap
Dim imageCopy As Bitmap = CopyTo32BitArgb(source)
Dim imageData As BitmapData = imageCopy.LockBits(New Rectangle(0, 0, source.Width, source.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb)
Dim buffer As Byte() = New Byte(Math.Abs(imageData.Stride) * imageCopy.Height - 1) {}
Marshal.Copy(imageData.Scan0, buffer, 0, buffer.Length)
Dim bytesPerPixel = Image.GetPixelFormatSize(source.PixelFormat) \ 8;
Dim red As Single = 0, green As Single = 0, blue As Single = 0
Dim pos As Integer = 0
While pos < buffer.Length
Dim color As Color = Color.FromArgb(BitConverter.ToInt32(buffer, pos))
' Dim h = color.GetHue()
' Dim s = color.GetSaturation()
' Dim l = color.GetBrightness()
red = buffer(pos) * 0.189F + buffer(pos + 1) * 0.769F + buffer(pos + 2) * 0.393F
green = buffer(pos) * 0.168F + buffer(pos + 1) * 0.686F + buffer(pos + 2) * 0.349F
blue = buffer(pos) * 0.131F + buffer(pos + 1) * 0.534F + buffer(pos + 2) * 0.272F
buffer(pos + 2) = CType(Math.Min(Byte.MaxValue, red), Byte)
buffer(pos + 1) = CType(Math.Min(Byte.MaxValue, green), Byte)
buffer(pos) = CType(Math.Min(Byte.MaxValue, blue), Byte)
pos += bytesPerPixel
End While
Marshal.Copy(buffer, 0, imageData.Scan0, buffer.Length)
imageCopy.UnlockBits(imageData)
imageData = Nothing
Return imageCopy
End Function
Stride
不一定总是最佳选择。
Bitmap.LockBits
)值数组将
5x5
矩阵变换应用于位图。
Single
类和众所周知的
ColorMatrix
矩阵应用灰度滤镜:
Public Function BitmapMatrixFilterGreyscale(source As Image) As Bitmap
' A copy of the original is not needed but maybe desirable anyway
' Dim imageCopy As Bitmap = CopyTo32BitArgb(source)
Dim filteredImage = New Bitmap(source.Width, source.Height, source.PixelFormat)
filteredImage.SetResolution(source.HorizontalResolution, source.VerticalResolution)
Dim grayscaleMatrix As New ColorMatrix(New Single()() {
New Single() {0.2126F, 0.2126F, 0.2126F, 0, 0},
New Single() {0.7152F, 0.7152F, 0.7152F, 0, 0},
New Single() {0.0722F, 0.0722F, 0.0722F, 0, 0},
New Single() {0, 0, 0, 1, 0},
New Single() {0, 0, 0, 0, 1}
})
Using g As Graphics = Graphics.FromImage(filteredImage), attributes = New ImageAttributes()
attributes.SetColorMatrix(grayscaleMatrix)
g.DrawImage(source, New Rectangle(0, 0, source.Width, source.Height),
0, 0, source.Width, source.Height, GraphicsUnit.Pixel, attributes)
End Using
Return filteredImage
End Function
关于.net - 分析图像的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59084511/
我刚刚继承了一个旧的 PostgreSQL 安装,需要进行一些诊断以找出该数据库运行缓慢的原因。在 MS SQL 上,您可以使用 Profiler 等工具来查看正在运行的查询,然后查看它们的执行计划。
将目标从Analytics(分析)导入到AdWords中,然后在Analytics(分析)中更改目标条件时,是否可以通过更改将目标“重新导入”到AdWords,还是可以自动选择? 最佳答案 更改目标值
我正在使用google analytics api来获取数据。我正在获取数据,但我想验证两个参数,它们在特定日期范围内始终为0。我正在获取['ga:transactions']和['ga:goalCo
我使用Google API从Google Analytics(分析)获取数据,但指标与Google Analytics(分析)的网络界面不同。 即:我在2015年3月1日获得数据-它返回综合浏览量79
我在我的Web应用程序中使用sammy.js进行剔除。我正在尝试向其中添加Google Analytics(分析)。我很快找到了following plugin来实现页面跟踪。 我按照步骤操作,页面如
当使用 Xcode 分析 (product>analyze) 时,有没有办法忽略给定文件中的任何错误? 例如编译指示之类的? 我们只想忽略第三方代码的任何警告,这样当我们的代码出现问题时,它对我们
目录 EFK 1. 日志系统 2. 部署ElasticSearch 2.1 创建handless服务 2.2 创建s
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
GCC/G++ 是否有可用于输出分析的选项? 能够比较以前的代码与新代码之间的差异(大小、类/结构的大小)将很有用。然后可以将它们与之前的输出进行比较以进行比较,这对于许多目的都是有用的。 如果没有此
我正在浏览 LYAH,并一直在研究处理列表时列表理解与映射/过滤器的使用。我已经分析了以下两个函数,并包含了教授的输出。如果我正确地阅读了教授的内容,我会说 FiltB 的运行速度比 FiltA 慢很
在 MySQL 中可以使用 SET profiling = 1; 设置分析 查询 SHOW PROFILES; 显示每个查询所用的时间。我想知道这个时间是只包括服务器的执行时间还是还包括将结果发送到前
我用 Python 编写了几个用于生成阶乘的模块,我想测试运行时间。我找到了一个分析示例 here我使用该模板来分析我的模块: import profile #fact def main():
前几天读了下mysqld_safe脚本,个人感觉还是收获蛮大的,其中细致的交代了MySQL数据库的启动流程,包括查找MySQL相关目录,解析配置文件以及最后如何调用mysqld程序来启动实例等,有着
上一篇:《人工智能大语言模型起源篇,低秩微调(LoRA)》 (14)Rae 和同事(包括78位合著者!)于2022年发表的《Scaling Language Models: Methods, A
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
1 内网基础 内网/局域网(Local Area Network,LAN),是指在某一区域内有多台计算机互联而成的计算机组,组网范围通常在数千米以内。在局域网中,可以实现文件管理、应用软件共享、打印机
我有四列形式的数据。前三列代表时间,value1,value 2。第四列是二进制,全为 0 或 1。当第四列中对应的二进制值为0时,有没有办法告诉excel删除时间、值1和值2?我知道这在 C++ 或
我正在运行一个进行长时间计算的 Haskell 程序。经过一些分析和跟踪后,我注意到以下内容: $ /usr/bin/time -v ./hl test.hl 9000045000050000 Com
我有一个缓慢的 asp.net 程序正在运行。我想分析生产服务器以查看发生了什么,但我不想显着降低生产服务器的速度。 一般而言,配置生产盒或仅本地开发盒是标准做法吗?另外,您建议使用哪些程序来实现这一
我目前正在尝试分析 Haskell 服务器。服务器永远运行,所以我只想要一个固定时间的分析报告。我尝试只运行该程序 3 分钟,然后礼貌地要求它终止,但不知何故,haskell 分析器不遵守术语信号,并
我是一名优秀的程序员,十分优秀!