Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将标准化图像数学公式转换为Python?_Python_Image_Opencv_Image Processing - Fatal编程技术网

如何将标准化图像数学公式转换为Python?

如何将标准化图像数学公式转换为Python?,python,image,opencv,image-processing,Python,Image,Opencv,Image Processing,我试图学习如何将等式转换为python脚本 我选择从学术资源的指纹增强开始 为了开始学习,我搜索要增强的指纹图像。我选择这个: 因此,我要做的第一步是转换为灰色: import cv2 import numpy as np input = 'PATH OF IMAGE' img = cv2.imread(input) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 结果如下: 好的,问题从这里开始 请试着理解我,我试着学习如何将数学公式转换成pyt

我试图学习如何将等式转换为python脚本

我选择从学术资源的指纹增强开始

为了开始学习,我搜索要增强的指纹图像。我选择这个:

因此,我要做的第一步是转换为灰色:

import cv2
import numpy as np

input = 'PATH OF IMAGE'
img = cv2.imread(input)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
结果如下:

好的,问题从这里开始

请试着理解我,我试着学习如何将数学公式转换成python脚本。 不要尝试在Github中查找其他/现有脚本(例如)。

方程式为:

所有的细节都来自。被告知: 让I(I,j)表示像素(I,j),M和处的灰度值 VAR分别表示I的估计平均值和方差,G(I,j)表示像素(I,j)处的归一化灰度值。 灰度指纹图像I被定义为nxn矩阵,其中I(I,j)表示像素在该位置的强度 第i行和第j列。我们假设所有的图像都是 以每英寸500点(dpi)的分辨率扫描。灰度指纹图像的均值和方差I定义为

及 分别

好,我们开始变换方程:

def mean(gray):
    rows, cols = gray.shape
    sum = 0
    for i in range(0,rows):
        for j in range(0, cols):
            pix = (gray[i,j].item())
            sum += pix
    M = sum/N
    return M

def var(gray, M):
    rows, cols = gray.shape
    N = gray.size
    sum = 0
    for i in range(0,rows):
        for j in range(0, cols):
            vix = ((img[i,j].item()) - M)**2
            sum += vix
    VAR = sum/N
    return VAR

def normalize(img, M0, VAR0):
    M = mean(img)
    VAR = var(img, M)
    rows,cols = img.shape
    normim = np.zeros((rows, cols))
    for i in range(0, rows):
        for j in range(0, cols):
            if (gray[i,j].item()) > M:
                G0 = M0 + ((((VAR0)*(((gray[i,j].item())-(M))**2))/(VAR))**(1/2))
                normim[i,j] = int(G0)
            else:
                G1 = M0 - ((((VAR0)*(((gray[i,j].item())-(M))**2))/(VAR))**(1/2))
                normim[i,j] = int(G1)
    return normim


M0 = 100 #follow the academic research document
VAR0 = 100 #follow the academic research document
normgray = normalize(gray, 100,100)

cv2.imshow('test', normgray)
cv2.waitKey(1)
结果出乎意料:

一切都是白色的

有人能帮我吗?请您指教


为了提醒你,我不是在寻找另一个脚本/另一个例子我试图理解如何将数学公式转换为python脚本。关于另一个脚本,我已经有了,甚至我已经映射了它。

我没有运行您的代码,但请确保G0或G1不会变得太大。可能是您的值高于255,因此生成的图像为全白色

这是一个简单的问题,在转换之间不考虑数据类型。具体来说,当您加载图像时,它将是无符号8位整数,因此预期值应在
[0,255]
范围内,但您对均值和方差的计算将超过此动态范围,因此您的计算将溢出。解决此问题的最快方法是转换图像,使其符合可以处理所需计算精度(如浮点)的数据类型。执行计算,完成后将图像转换回预期的数据类型,即无符号8位整数

此外,代码中还有几个错误。首先,您没有提供变量
N
,它应该是图像中的像素总数。此外,您的
var
函数接受
gray
作为变量,但您正在使用
img
尝试访问像素数据,因此在尝试运行该函数时也会出现错误。最后,您省略了正在使用的软件包,因此我在中添加了这些

我也在本地下载了你的图像,这样我就可以运行代码来验证它是否有效。我已经修补了代码的结尾,以便在按下一个键并将输出图像写入文件后,显示结果的图像窗口正确关闭

因此:

# Added so the code can run
import cv2
import numpy as np

# Added so the code can run
gray = cv2.imread('gnN4Q.png', 0)
gray = gray.astype(np.float) # Change to floating-point
N = gray.shape[0]*gray.shape[1]

def mean(gray):
    rows, cols = gray.shape
    sum = 0
    for i in range(0,rows):
        for j in range(0, cols):
            pix = (gray[i,j].item())
            sum += pix
    M = sum/N # Added above
    return M

def var(gray, M):
    rows, cols = gray.shape
    N = gray.size
    sum = 0
    for i in range(0,rows):
        for j in range(0, cols):
            vix = ((gray[i,j].item()) - M)**2 # Change
            sum += vix
    VAR = sum/N
    return VAR

def normalize(img, M0, VAR0):
    M = mean(img)
    VAR = var(img, M)
    rows,cols = img.shape
    normim = np.zeros((rows, cols))
    for i in range(0, rows):
        for j in range(0, cols):
            if (gray[i,j].item()) > M:
                G0 = M0 + ((((VAR0)*(((gray[i,j].item())-(M))**2))/(VAR))**(1/2))
                normim[i,j] = int(G0)
            else:
                G1 = M0 - ((((VAR0)*(((gray[i,j].item())-(M))**2))/(VAR))**(1/2))
                normim[i,j] = int(G1)
    return normim

M0 = 100 #follow the academic research document
VAR0 = 100 #follow the academic research document
normgray = normalize(gray, 100,100)
normgray = normgray.astype(np.uint8) # Added - convert back to uint8
cv2.imshow('test', normgray)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('output.png', normgray)
我们得到的输出图像是:


学术研究报告写道,他使用相同的方法,使用相同的M0和VAR0值(两者均=100)。这让我很困惑,因为如果我尝试计数gray[1,2].item(),例如,值是255。当我输入公式时,点变成105。是的,这个公式使255变为255以下。这里的另一个学术研究:,使用类似的方法。见第15页。但奇怪的是。。。。我没有得到类似的结果。我已经用脚本切克了。没有大于255的值。脚本:对于范围(0,行)中的i:。。。对于范围(0,cols)内的j:。。。如果[i,j].item()>255:。。。打印(normgray[i,j].item())>>>是的,都在255OMG以下…你说得对。。。问题是由数据类型引起的。因此,等式被成功地翻译为Python脚本,但不考虑数据类型。要解决这个问题,只需:normgray=normgray.astype(np.uint8)和about N=gray.shape[0]*gray.shape[1]==N=gray.sizesorry无法选择flag作为答案,但问题已经得到了回答。顺便说一句,我开始学习,学术期刊/研究。你可以在这里看到:为什么等式的结果…非常满…不像acedemic报告你确定你不能选择我的答案吗?只需单击上下箭头下方的复选标记图标。很高兴我能帮忙!是的,旗帜的颜色是:垃圾邮件,粗鲁或辱骂,不是回答,需要版主干预。好的,我试着用主持人的干预来回答这个问题