比较相似的图像数据——macOS迅速控制台

本教程将展示如何使用各种图像处理命令来比较两个图像和确定类似他们迅速macOS控制台应用程序使用LEADTOOLS SDK。

概述
总结 本教程介绍了如何使用各种图像处理命令比较图像迅速macOS控制台应用程序。
完成时间 30分钟
项目 下载教程项目(7 KB)
平台 斯威夫特macOS控制台应用程序
IDE Xcode
运行许可证 下载LEADTOOLS
试试用另一种语言

所需的知识

熟悉基本的步骤创建一个项目的审查添加引用和设置一个许可证教程,在工作之前比较相似的图像数据——macOS迅速控制台教程。

创建项目并添加LEADTOOLS引用

从项目中创建的副本添加引用和设置一个许可证教程。如果你没有这个项目,按照这个教程中的步骤创建它。

的引用需要取决于项目的目的。本教程需要引用位于下面的框架< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ \ macOS Xcode \框架:

哪个框架的完整列表应用程序所需文件,请参考文件包含在您的应用程序

编辑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引用和设置许可中会详细介绍添加引用和设置一个许可证教程。

添加图像比较代码

与项目创建、添加引用,许可,可以开始编码。

本教程将比较两个图像通过计算使用后黑色像素的比例CombineCommandOperationXor国旗,所有像素的平均强度使用StatisticsInformationCommand,平均使用色相和饱和度值ColorSeparateCommand的差异,平均每个颜色频率的大小FastFourierTransformCommand

使用项目导航器,打开main.swift

内部文件,下面SetLicense ()添加两个新的字符串变量并设置等于两个单独的图像文件的路径,如下所示。对于本教程中,您可以下载测试图像在这里。例如,比较1 stred.png2 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方法。在此方法中,我们将使用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.operationXorcombineCommand。sourceImage = image1combineCommand。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.meanvar相似:双= 1.0 - (abs (leftIntensity - rightIntensity) / 255.0)打印(“整体形象强度:\ (String(格式:“% .2f”,100.0 *相似))%匹配”)/ /检查的强度不同让combineCommand: LTCombineCommand = LTCombineCommand ()combineCommand.destinationRectangle = LeadRectMake (0, 0, image1Gray。宽度,image1Gray.height)combineCommand。旗帜= .operationXorcombineCommand。sourceImage = image1GraycombineCommand。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:双= 0var 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:双= 0var 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:双= 0var 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 + image2MagnitudemagnitudeTotalDiff + = 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命令来获得两幅图像的相似度的统计数据。

另请参阅

net
iOS
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2022领先的技术公司。保留所有权利。