本教程将展示如何使用各种图像处理命令来比较两个图像和确定类似他们迅速macOS控制台应用程序使用LEADTOOLS SDK。
概述 | |
---|---|
总结 | 本教程介绍了如何使用各种图像处理命令比较图像迅速macOS控制台应用程序。 |
完成时间 | 30分钟 |
项目 | 下载教程项目(7 KB) |
平台 | 斯威夫特macOS控制台应用程序 |
IDE | Xcode |
运行许可证 | 下载LEADTOOLS |
试试用另一种语言 |
|
熟悉基本的步骤创建一个项目的审查添加引用和设置一个许可证教程,在工作之前比较相似的图像数据——macOS迅速控制台教程。
从项目中创建的副本添加引用和设置一个许可证教程。如果你没有这个项目,按照这个教程中的步骤创建它。
的引用需要取决于项目的目的。本教程需要引用位于下面的框架< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ \ macOS Xcode \框架
:
Leadtools.framework
Leadtools.Codecs.framework
Leadtools.Codecs.Png.framework
Leadtools.ImageProcessing.Color.framework
Leadtools.ImageProcessing.Core.framework
Leadtools.ImageProcessing.Effects.framework
Leadtools.ImageProcessing.Utilities.framework
哪个框架的完整列表应用程序所需文件,请参考文件包含在您的应用程序。
编辑Leadtools-Bridging-Header.h
文件添加以下进口:
#进口< Leadtools.Codecs / Leadtools.Codecs.h >
#进口< Leadtools.ImageProcessing.Color / Leadtools.ImageProcessing.Color.h >
#进口< Leadtools.ImageProcessing.Core / Leadtools.ImageProcessing.Core.h >
#进口< Leadtools.ImageProcessing.Effects / Leadtools.ImageProcessing.Effects.h >
许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可。
有两种类型的运行时许可证:
请注意
添加LEADTOOLS引用和设置许可中会详细介绍添加引用和设置一个许可证教程。
与项目创建、添加引用,许可,可以开始编码。
本教程将比较两个图像通过计算使用后黑色像素的比例CombineCommand
与OperationXor
国旗,所有像素的平均强度使用StatisticsInformationCommand
,平均使用色相和饱和度值ColorSeparateCommand
的差异,平均每个颜色频率的大小FastFourierTransformCommand
。
使用项目导航器,打开main.swift
。
内部文件,下面SetLicense ()
添加两个新的字符串变量并设置等于两个单独的图像文件的路径,如下所示。对于本教程中,您可以下载测试图像在这里。例如,比较1 stred.png
与2 ndred.png
。
让image1Filename:字符串=“/道路/ /形象”
让image2Filename:字符串=“/道路/ /形象”
让image1: LTRasterImage = LoadImage(文件:image1Filename)其他的{fatalError (“图1加载失败。”)}
让image2: LTRasterImage = LoadImage(文件:image2Filename)其他的{fatalError (“图2加载失败。”)}
打印(图1:\ (image1Filename)”)
打印(图2:\ (image2Filename)”)
CompareXOR (image1: image1 image2: image2)
CompareIntensities (image1: image1 image2: image2)
CompareHSV (image1: image1 image2: image2)
CompareFourier (image1: image1 image2: image2)
添加一个新的函数命名LoadImage(文件:字符串)
。这个函数被调用内部的两倍让
语句,如上所示。将下面的代码添加到LoadImage
方法加载给定的文件RasterImage
对象。
LoadImage func(文件:字符串)- > LTRasterImage吗?{
让编解码器:LTRasterCodecs = LTRasterCodecs ()
做{
返回试一试编解码器。负载(文件:文件)
}抓{
打印(error.localizedDescription)
}
返回零
}
添加四个新函数命名如下:
CompareXOR (image1: LTRasterImage image2: LTRasterImage)
CompareIntensities (image1: LTRasterImage image2: LTRasterImage)
CompareHSV (image1: LTRasterImage image2: LTRasterImage)
CompareFourier (image1: LTRasterImage image2: LTRasterImage)
。调用这四个函数,如上所示。
添加以下代码CompareXOR
方法。在此方法中,我们将使用LTCombineCommand
。这地方一个图像到另一个在一个特定的位置和在一个特定的矩形。底层图像的像素的方式覆盖图像的影响取决于我们使用的旗帜。在本例中,我们将使用一个LeadRect
大小相同的图像使用整个图像底部。我们将使用OperationXor
国旗将执行按位异或操作上每组顶部和底部从每个图像像素。
这应该创建黑色像素的两个像素在同一位置的图片是相同的,和白色的其他地方。计算两幅图像之间的多少都是一样的,我们将创建一个区域只有黑色像素和比较像素的总和。
func CompareXOR (image1: LTRasterImage image2: LTRasterImage) {
做{
让image2Copy =试一试image2.clone ()
/ /合并XOR的图像
让combineCommand: LTCombineCommand = LTCombineCommand ()
combineCommand.destinationRectangle = LeadRectMake (0, 0, image1。宽度,image1.height)
combineCommand。旗帜= LTCombineCommandFlags.operationXor
combineCommand。sourceImage = image1
combineCommand。sourcePoint = LeadPointMake (0, 0)
试一试combineCommand.run (image2Copy)
/ /计算的百分比黑色像素(XOR是相同的)
试一试image2Copy。(颜色:LTRasterColor addColorToRegion。黑色,combineMode LTRasterRegionCombineMode.set):
让比率:双=双(Int (image2Copy.regionArea) / (image2Copy。宽度* image2Copy.height))
打印(“个人像素:\ (String(格式:“% .2f”,100.0 *比率))%匹配”)
}抓{
打印(error.localizedDescription)
}
}
添加以下代码CompareIntensities
创建一个实例的方法LTStatisticsInformationCommand
,它允许您只包括一定范围或颜色的像素统计人口。我们将使用所有像素,值0 - 255从主频道。我们将收集图像的平均值和比较两个尺度改变它为0 - 1.00而不是0 - 255。这将给我们平均强度或亮度的差异。
我们还可以使用该命令来获得强度的差异这些图像通过一个XOR通过它CombineCommand
像以前一样。这将是计算从相同的像素值的比例不同的像素值。
func CompareIntensities (image1: LTRasterImage image2: LTRasterImage) {
做{
让image1Gray =试一试image1.clone ()
让image2Gray =试一试image2.clone ()
/ /将两个图像转换成灰度
让灰度:LTGrayscaleCommand = LTGrayscaleCommand ()
灰度。bitsPerPixel = 8
试一试grayscale.run (image1Gray)
试一试grayscale.run (image2Gray)
/ /比较平均整体强度
让统计数据:LTStatisticsInformationCommand = LTStatisticsInformationCommand ()
统计数据。频道= LTRasterColorChannel.master
统计数据。结束= 255
统计数据。= 0开始
试一试statistics.run (image1Gray)
让leftIntensity:双= statistics.mean
试一试statistics.run (image2Gray)
让rightIntensity:双= statistics.mean
var相似:双= 1.0 - (abs (leftIntensity - rightIntensity) / 255.0)
打印(“整体形象强度:\ (String(格式:“% .2f”,100.0 *相似))%匹配”)
/ /检查的强度不同
让combineCommand: LTCombineCommand = LTCombineCommand ()
combineCommand.destinationRectangle = LeadRectMake (0, 0, image1Gray。宽度,image1Gray.height)
combineCommand。旗帜= .operationXor
combineCommand。sourceImage = image1Gray
combineCommand。sourcePoint = LeadPointMake (0, 0)
试一试combineCommand.run (image2Gray)
试一试statistics.run (image2Gray)
相似度= 1.0 -(统计数据。意思是/ 255.0)
打印(”的形象不同强度:\ (String(格式:“% .2f”,100.0 *相似))%匹配”)
}抓{
打印(error.localizedDescription)
}
}
添加以下代码CompareHSV
方法分离图像色调,饱和度,和价值的渠道,而不是红色,绿色和蓝色。这将创建一个DestinationImage
对象有三个页面,每个通道一个。我们可以使用LTStatisticsInformationCommand
再次找到图像的色相和饱和度平均每个页面上运行它的分离图像。平均价值本质上是图像的亮度不一样有用。我们可以比较平均色相和饱和度的差异,再扩展到从0 - 255 0 - 100。
func CompareHSV (image1: LTRasterImage image2: LTRasterImage) {
让colorSeparate: LTColorSeparateCommand = LTColorSeparateCommand ()
colorSeparate。类型= LTColorSeparateCommandType.hsv
让统计数据:LTStatisticsInformationCommand = LTStatisticsInformationCommand ()
统计数据。频道= LTRasterColorChannel.master
统计数据。结束= 255
统计数据。= 0开始
/ /独立的第一形象,计算平均值
做{
试一试colorSeparate.run (image1)
}抓{
打印(error.localizedDescription)
}
var image1Hue:双= 0
var image1Saturation:双= 0
让image1Separated: LTRasterImage = colorSeparate.destinationImage !
image1Separated。页面= 1
做{
试一试statistics.run (image1Separated)
image1Hue = statistics.mean
}抓{
打印(error.localizedDescription)
}
image1Separated。页面= 2
做{
试一试statistics.run (image1Separated)
image1Saturation = statistics.mean
}抓{
打印(error.localizedDescription)
}
/ /单独的第二图像,计算平均值
做{
试一试colorSeparate.run (image2)
}抓{
打印(error.localizedDescription)
}
var image2Hue:双= 0
var image2Saturation:双= 0
让image2Separated: LTRasterImage = colorSeparate.destinationImage !
image2Separated。页面= 1
做{
试一试statistics.run (image2Separated)
image2Hue = statistics.mean
}抓{
打印(error.localizedDescription)
}
image2Separated。页面= 2
做{
试一试statistics.run (image2Separated)
image2Saturation = statistics.mean
}抓{
打印(error.localizedDescription)
}
/ /计算色调的区别
/ /注意:0是255,所以需要弥补这一缺陷
var hueDiff:双= abs (image1Hue - image2Hue)
如果hueDiff > 127 {
hueDiff = abs (hueDiff - 255)
}
/ /日志色调相似
var相似:双= 1.0 - (hueDiff / 255.0)
打印(“平均颜色值:\ (String(格式:“% .2f”,100.0 *相似))%匹配”)
/ /日志饱和度相似
相似度= 1.0 - (abs (image1Saturation - image2Saturation) / 255.0)
打印(“平均饱和度值:\ (String(格式:“% .2f”,100.0 *相似))%匹配”)
}
最后,添加以下代码CompareHSV
方法比较两个图像使用的频率分布LTFastFourierTransformCommand
。快速傅里叶变换、FFT原理是将图像从空间域转换为频域用于过滤掉噪音之类的东西。我们将使用这个比较每个频率的大小。一旦我们运行该命令,我们可以使用的信息对象的数据
财产的LTComplex
数字与每个频率相关,计算每个频率的大小,计算两平均数之间的差异。
func CompareFourier (image1: LTRasterImage image2: LTRasterImage) {
做{
让image1Copy: LTRasterImage =试一试image1.clone ()
让image2Copy: LTRasterImage =试一试image2.clone ()
/ /确保图片是相同的大小
如果image1Copy。宽度! = image2Copy。宽度| | image1Copy。高度! = image2Copy。高度{
/ /可以使用的最小大小,但我们只会将其设置为一个固定的256到256年
让大小:LTSizeCommand = LTSizeCommand ()
大小。旗帜= LTRasterSizeFlags.bicubic
大小。身高= 256
大小。宽度= 256
试一试size.run (image1Copy)
试一试size.run (image2Copy)
}
/ /设置快速傅里叶变换(FFT)的数据
/ /注意:我们希望填充标志这可以处理大小不2的幂
让fftFlags = LTFastFourierTransformCommandFlags.fastFourierTransform。rawValue | LTFastFourierTransformCommandFlags.gray。rawValue | LTFastFourierTransformCommandFlags.padOptimally.rawValue
让image1Info: LTFourierTransformInformation =试一试LTFourierTransformInformation(图片:image1Copy、旗帜:LTFastFourierTransformCommandFlags (rawValue: fftFlags))
让image2Info: LTFourierTransformInformation =试一试LTFourierTransformInformation(图片:image2Copy、旗帜:LTFastFourierTransformCommandFlags (rawValue: fftFlags))
/ /应用FFT图像
让fft: LTFastFourierTransformCommand = LTFastFourierTransformCommand。在我t(information: image1Info, flags: LTFastFourierTransformCommandFlags(rawValue: fftFlags))
试一试fft.run (image1Copy)
fft。fourierTransformInformation = image2Info
试一试fft.run (image2Copy)
/ /计算频率的相似性基于每个组件的大小
var magnitudeTotal:双= 0
var magnitudeTotalDiff:双= 0
让长度:Int = Int (image1Info.dataSize)
让image1Data: [LTComplex] = arrayForPointer (image1Info.data !数:长度)
让image2Data: [LTComplex] = arrayForPointer (image2Info.data !数:Int (image2Info.dataSize))
为我在0 . .<{长度
/ /计算级eachg条目
让image1Entry: LTComplex = image1Data[我]
让image1Magnitude: =√image1Entry两倍。r * image1Entry。r + image1Entry。我* image1Entry.i)
让image2Entry = image2Data[我]
让image2Magnitude: =√image2Entry两倍。r * image2Entry。r + image2Entry。我* image2Entry.i)
/ /增加总数
magnitudeTotal + = image1Magnitude + image2Magnitude
magnitudeTotalDiff + = abs (image1Magnitude - image2Magnitude)
}
/ /确保我们不除以零
如果magnitudeTotal = = 0 {
magnitudeTotal = 1
}
/ /日志结果
让相似度= (magnitudeTotal - magnitudeTotalDiff) / magnitudeTotal
打印(“频率比较:\ (String(格式:“% .2f”,100.0 *相似))%匹配”)
}抓{
打印(error.localizedDescription)
}
}
func arrayForPointer < T >(_指针:UnsafePointer < T >、数:Int) - > [T] {
让缓冲区= UnsafeBufferPointer(开始:指针,数:统计)
返回阵列(缓冲)
}
通过选择清洁项目明确的任何错误产品- >清洁建立文件夹或Shift +命令+ K。
该项目通过选择运行产品- >运行或命令+ R。
如果步骤正确之后,应用程序运行和执行上的多个计算两幅图像输出相似统计到控制台。
本教程演示了如何使用各种图像处理命令包括LTCombineCommand
,LTGrayscaleCommand
,LTStatisticsInformationCommand
,LTColorSeparateCommand
,LTSizeCommand
,LTFastFourierTransformCommand
命令来获得两幅图像的相似度的统计数据。