用隐式方程修正像素

2024-09-25 02:34:16 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:

简而言之: 我有三张图片:参考图片和另外两张。参考图像用于将其他两个调整为适当的值。-这部分应该没问题。 然后我将另外两张图片(数组)相减,得到一个隐藏像素的数组 现在棘手的是:

enter image description here

这是我的方程,我想在每个像素分别解决,我的结果应该是“h”在一个新的数组,我将导出到excel 非常感谢你的帮助。你知道吗

import scipy
import numpy as np
from PIL import Image
from scipy.optimize import fsolve                    


P0 = Image.open('3kanaly0.tif')                                                               
m = scipy.misc.imread("3kanaly0.tif")
P0 = m[:,:,0]
print(P0)

P0_T = np.array(P0)/4

#1image
m = scipy.misc.imread("3.tif")
P1 = m[:,:,0]
print(P1)

P1_T = np.array(P1)/4                               
print(P1_T.shape)
print("P1_T (z)",type(P1_T))
print(P1_T)


#adjust
Texp = input()
Texp = int(Texp)

print("Start beta")
def beta(Texp,Tcal = 20):
    return Texp/Tcal
b = beta(Texp)
print("beta :", b)
print(" beta")

print("Start alfa")
def alfa(A,B,C,D,b):
    return A*b**3+B*b**2+C*b+D
wynik_alfa = alfa(0.0097,-0.08,-0.038,1.016,b)
print("alfa i:",wynik_alfa)
print(" alfa")

#
Tcal = 20
a = -10.978
b = 22.76
c = -19.317
d = 8.4634
Temp_T =  Tcal*(a*(wynik_alfa*P1_T/P0_T)**3+b*(wynik_alfa*P1_T/P0_T)**2+c*wynik_alfa*P1_T/P0_T+d)




#2image
m = scipy.misc.imread("3kanaly2.tif")
P2 = m[:,:,0]

Temp_T2 =  Tcal*(a*(wynik_alfa*P2_T/P0_T)**3+b*(wynik_alfa*P2_T/P0_T)**2+c*wynik_alfa*P2_T/P0_T+d)




r = np.subtract(Temp_T,Temp_T2)



a = 20
k = 400
Tpow = 80.0
ro = 8920
cp = 384
t = 2

print(type(k))
print(type(Tpow))
print(type(ro))
print(type(cp))
print(type(t))
print(type(P1_T))
print(type(r))


for i in range(len(Temp_T)):
    for j in range(len(Temp_T2[0])):
        fsolve((r[i][j] + (Tpow -Temp_T[i][j])*(1-exp(h**2)*exp(a*t/k**2)*h*(a**0.5*t**0.5)/k)))

Tags: importtypenpscipytempbetaprintp2
2条回答

啊,我明白了,你是在用fsolve解h。Fsolve将函数作为其初始参数,并将缺失值的初始猜测作为第二个参数。所以你需要把方程定义为一个函数:

def equation(h):
  return r[i][j] + (Tpow -P1_T[i][j])*(1-exp(h**2)*exp(a*t/k**2)*h*(a**0.5*t**0.5)/k)

然后将该函数传递给fsolve,以及h的初始猜测(在本例中为5):

h_vals = np.zeros_like(P0_T)
for i in range(len(P1_T)):
    print(i)
    for j in range(len(P1_T[0])):
        a = fsolve(equation,5)
        h_vals[i][j] = a

根据您的图像,这可能需要很长时间来计算。你知道吗

你的帖子有点模棱两可,但不管怎样我都会尽力帮助你。如前所述,我对你的问题的“可解决性”不是很有信心,因为我对你作品的两种解读方式导致了两个不同的问题。据我所知,你正试图解决以下问题:

1)R = A(h)*P1

其中A是将图像P1连接到残差R=P1-P2的运算符,它取决于给定值的许多变量(A,k,t),此外,它还取决于要查找的量h。你知道吗

如果这是真的,有两种选择。首先,如果h对于每个像素都是独立的,那么您所追求的是h的N个值,那么您的问题基本上如下所示:

2)R[i][j] = A(h)[i][j] * P1[i][j]

N是像素数。注意2)不是矩阵方程,这里的乘法是按元素的,而不是矩阵乘法。所以我们在这里看到的是N个不相关的方程。由此看来,你不应该使用矩阵求解技术来寻找解决方案。如果您无法重写2)使其显式(即h=…),你将无法解h。如果你不能用数学为你的方程写解,你将无法写一个程序来解它。你知道吗

第二个选项是寻找单个值h。在本例中,您试图解决的问题是一个矩阵-向量方程,其大致形式如下:

3)R[:] = A(h)P1[:]

其中R和P1被重组为长度为N的向量,A是某种形式(稀疏或密集)的N×N矩阵。在这种情况下,我们不能解决这个问题,因为矩阵A不是唯一的;你有N个方程和N^2个未知数。h的多个值可能导致一个解,或者,该问题只能在最小二乘意义下解决。你知道吗

如果你要解决的问题与我上面写的两个不同,请试着用数学的方法写下你要解决的问题,我认为这对找到解决方案(如果存在的话)非常有帮助。你知道吗

相关问题 更多 >