gpt4 book ai didi

opencv - 检测图像问题

转载 作者:行者123 更新时间:2023-12-02 16:06:57 26 4
gpt4 key购买 nike

我真的不知道它叫什么(失真或其他)
但我想通过使用 emgucv(或 opencv)来检测某些不同类型图像的镜头相机问题

任何关于使用哪些算法的想法将不胜感激

Distortion

第二张图像似乎有高噪音,但是有什么办法可以通过opencv理解高噪音?

high noise

最佳答案

如果没有引用数据或同质样本,这通常很难实现。但是,我提出了一个分析图像的平均 SNR ( Signal to Noise ) 比率的建议。该算法根据指定的内核大小将输入图像划分为指定数量的“子图像”,以便独立评估每个子图像的局部 SNR。然后对每个子图像的计算 SNR 进行平均,以提供 指标 图像的全局 SNR。

您将需要详尽地测试这种方法,但是它在以下三个图像上显示出有希望,产生 AvgSNR

图像 #1 - AvgSNR = 0.9

Image 1

图像 #2 - AvgSNR = 7.0

Image 2

图像 #3 - AvgSNR = 0.6

Image 3

注意: 看看“干净”的控制图像如何产生更高的 AvgSNR

唯一要考虑的变量是内核大小。我建议将其保持在可以支持最小的潜在输入图像的大小。 30 像素正方形可能适合许多图像。

我用注释附上了我的测试代码:

class Program
{
static void Main(string[] args)
{
// List of file names to load.
List<string> fileNames = new List<string>()
{
"IifXZ.png",
"o1z7p.jpg",
"NdQtj.jpg"
};

// For each image
foreach (string fileName in fileNames)
{
// Determine local file path
string path = Path.Combine(Environment.CurrentDirectory, @"TestImages\", fileName);
// Load the image
Image<Bgr, byte> inputImage = new Image<Bgr, byte>(path);

// Compute the AvgSNR with a kernel of 30x30
Console.WriteLine(ComputeAverageSNR(30, inputImage.Convert<Gray, byte>()));

// Display the image
CvInvoke.NamedWindow("Test");
CvInvoke.Imshow("Test", inputImage);
while (CvInvoke.WaitKey() != 27) { }
}

// Pause for evaluation
Console.ReadKey();
}

static double ComputeAverageSNR(int kernelSize, Image<Gray, byte> image)
{
// Calculate the number of sub-divisions given the kernel size
int widthSubDivisions, heightSubDivisions;
widthSubDivisions = (int)Math.Floor((double)image.Width / kernelSize);
heightSubDivisions = (int)Math.Floor((double)image.Height / kernelSize);
int totalNumberSubDivisions = widthSubDivisions * widthSubDivisions;
Rectangle ROI = new Rectangle(0, 0, kernelSize, kernelSize);

double avgSNR = 0;
// Foreach sub-divions, calculate the SNR and sum to the avgSNR
for (int v = 0; v < heightSubDivisions; v++)
{
for (int u = 0; u < widthSubDivisions; u++)
{
// Iterate the sub-division position
ROI.Location = new Point(u * kernelSize, v * kernelSize);
// Calculate the SNR of this sub-division
avgSNR += ComputeSNR(image.GetSubRect(ROI));
}
}

avgSNR /= totalNumberSubDivisions;

return avgSNR;
}

static double ComputeSNR(Image<Gray, byte> image)
{
// Local varibles
double mean, sigma, snr;

// Calculate the mean pixel value for the sub-division
int population = image.Width * image.Height;
mean = CvInvoke.Sum(image).V0 / population;

// Calculate the Sigma of the sub-division population
double sumDeltaSqu = 0;
for (int v = 0; v < image.Height; v++)
{
for (int u = 0; u < image.Width; u++)
{
sumDeltaSqu += Math.Pow(image.Data[v, u, 0] - mean, 2);
}
}
sumDeltaSqu /= population;
sigma = Math.Pow(sumDeltaSqu, 0.5);

// Calculate and return the SNR value
snr = sigma == 0 ? mean : mean / sigma;
return snr;
}
}

注意: 如果没有引用,则无法区分自然方差/保真度和“噪声”。例如,高纹理背景或具有很少同质区域的场景将产生高 AvgSNR 。当评估的场景主要由普通的单色表面(例如服务器机房或店面)组成时,这种方法将表现最佳。例如,草会包含大量纹理,因此会包含“噪音”。

关于opencv - 检测图像问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62003846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com