如何将标准化图像数学公式转换为Python?
我试图学习如何将等式转换为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
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报告你确定你不能选择我的答案吗?只需单击上下箭头下方的复选标记图标。很高兴我能帮忙!是的,旗帜的颜色是:垃圾邮件,粗鲁或辱骂,不是回答,需要版主干预。好的,我试着用主持人的干预来回答这个问题