5
A
答えて
7
私は、ある種のピークを示す画像を持っていると仮定しています。x方向とy方向の両方でそのピークの歪度と尖度(おそらく標準偏差と重心)を得るのは面白いです。
私はこれについても疑問に思っていました。不思議なことに、私はこれをpython画像解析パッケージのいずれにも実装していませんでした。 OpenCVはmoments functionであり、これらから歪度を得ることができるはずですが、瞬間は3次のみになり、尖度を得るには4次が必要です。
もっと簡単で速くするために、画像をx方向とy方向に投影し、これらの投影から統計を見つけることは数学的には完全な画像を使って統計を見つけることと同じだと思います。次のコードでは、両方のメソッドを使用して、このスムーズな例では同じであることを示しています。実際の騒々しい画像を使用して、私は、2つの方法でも同じ結果が得られることを発見しました。ただし、画像データをfloat64に手動でキャストした場合(浮動小数点32としてインポートされ、以下は
例です。あなたは自分のコードの中に「image_statistics()」機能をカット&ペーストすることができるはずです。うまくいけば、それが誰かのために働く!:)出力の
import numpy as np
import matplotlib.pyplot as plt
import time
plt.figure(figsize=(10,10))
ax1 = plt.subplot(221)
ax2 = plt.subplot(222)
ax4 = plt.subplot(224)
#Make some sample data as a sum of two elliptical gaussians:
x = range(200)
y = range(200)
X,Y = np.meshgrid(x,y)
def twoD_gaussian(X,Y,A=1,xo=100,yo=100,sx=20,sy=10):
return A*np.exp(-(X-xo)**2/(2.*sx**2)-(Y-yo)**2/(2.*sy**2))
Z = twoD_gaussian(X,Y) + twoD_gaussian(X,Y,A=0.4,yo=75)
ax2.imshow(Z) #plot it
#calculate projections along the x and y axes for the plots
yp = np.sum(Z,axis=1)
xp = np.sum(Z,axis=0)
ax1.plot(yp,np.linspace(0,len(yp),len(yp)))
ax4.plot(np.linspace(0,len(xp),len(xp)),xp)
#Here is the business:
def image_statistics(Z):
#Input: Z, a 2D array, hopefully containing some sort of peak
#Output: cx,cy,sx,sy,skx,sky,kx,ky
#cx and cy are the coordinates of the centroid
#sx and sy are the stardard deviation in the x and y directions
#skx and sky are the skewness in the x and y directions
#kx and ky are the Kurtosis in the x and y directions
#Note: this is not the excess kurtosis. For a normal distribution
#you expect the kurtosis will be 3.0. Just subtract 3 to get the
#excess kurtosis.
import numpy as np
h,w = np.shape(Z)
x = range(w)
y = range(h)
#calculate projections along the x and y axes
yp = np.sum(Z,axis=1)
xp = np.sum(Z,axis=0)
#centroid
cx = np.sum(x*xp)/np.sum(xp)
cy = np.sum(y*yp)/np.sum(yp)
#standard deviation
x2 = (x-cx)**2
y2 = (y-cy)**2
sx = np.sqrt(np.sum(x2*xp)/np.sum(xp))
sy = np.sqrt(np.sum(y2*yp)/np.sum(yp))
#skewness
x3 = (x-cx)**3
y3 = (y-cy)**3
skx = np.sum(xp*x3)/(np.sum(xp) * sx**3)
sky = np.sum(yp*y3)/(np.sum(yp) * sy**3)
#Kurtosis
x4 = (x-cx)**4
y4 = (y-cy)**4
kx = np.sum(xp*x4)/(np.sum(xp) * sx**4)
ky = np.sum(yp*y4)/(np.sum(yp) * sy**4)
return cx,cy,sx,sy,skx,sky,kx,ky
#We can check that the result is the same if we use the full 2D data array
def image_statistics_2D(Z):
h,w = np.shape(Z)
x = range(w)
y = range(h)
X,Y = np.meshgrid(x,y)
#Centroid (mean)
cx = np.sum(Z*X)/np.sum(Z)
cy = np.sum(Z*Y)/np.sum(Z)
###Standard deviation
x2 = (range(w) - cx)**2
y2 = (range(h) - cy)**2
X2,Y2 = np.meshgrid(x2,y2)
#Find the variance
vx = np.sum(Z*X2)/np.sum(Z)
vy = np.sum(Z*Y2)/np.sum(Z)
#SD is the sqrt of the variance
sx,sy = np.sqrt(vx),np.sqrt(vy)
###Skewness
x3 = (range(w) - cx)**3
y3 = (range(h) - cy)**3
X3,Y3 = np.meshgrid(x3,y3)
#Find the thid central moment
m3x = np.sum(Z*X3)/np.sum(Z)
m3y = np.sum(Z*Y3)/np.sum(Z)
#Skewness is the third central moment divided by SD cubed
skx = m3x/sx**3
sky = m3y/sy**3
###Kurtosis
x4 = (range(w) - cx)**4
y4 = (range(h) - cy)**4
X4,Y4 = np.meshgrid(x4,y4)
#Find the fourth central moment
m4x = np.sum(Z*X4)/np.sum(Z)
m4y = np.sum(Z*Y4)/np.sum(Z)
#Kurtosis is the fourth central moment divided by SD to the fourth power
kx = m4x/sx**4
ky = m4y/sy**4
return cx,cy,sx,sy,skx,sky,kx,ky
#Calculate the image statistics using the projection method
stats_pr = image_statistics(Z)
#Confirm that they are the same by using a 2D calculation
stats_2d = image_statistics_2D(Z)
names = ('Centroid x','Centroid y','StdDev x','StdDev y','Skewness x','Skewness y','Kurtosis x','Kurtosis y')
print 'Statistis\t1D\t2D'
for name,i1,i2 in zip(names, stats_2d,stats_pr):
print '%s \t%.2f \t%.2f'%(name, i1,i2)
plt.show()
スクリーンショット、ちょうど楽しみのため:
もう1つ:画像で何をしているのかによって、画像解析にImageJを使用することをおすすめしますが、注意してください。 moments pluginは、歪度、尖度などを計算させます。ImageJは、Analyze >> Set Measurementsメニューで「歪度」と「尖度」を持っていますが、実際には強度ヒストグラムの歪度と尖度がわかります毎分だまされる)。
関連する問題
- 1. Android OpenGL ESひずみ画像
- 2. スケッチせずに画像部分を
- 3. onclick部分画像の更新のためのhtml画像
- 4. Wordpressのひどい画像解像度
- 5. 画像の特定の部分を取得する(画像)
- 6. Jquery:画像スライダーの最上部の画像のみを表示
- 7. 積分画像(OpenCV)を使った高速ぼかし画像
- 8. 畳み込み、画像上の画像
- 9. 一部の部分のみが画像をぼかす
- 10. UITableViewCell画像間違った画像を読み込む
- 11. SVG clipPathクリップの間違った部分画像
- 12. タッチ時の画像の抽出部分
- 13. バッファリングされた画像の部分だけを描画する
- 14. iOSのUITabBarItem画像selectedImageと画像ショー間違った
- 15. Rails Herokuローディング部分の背景画像
- 16. 画像のぼかし部分
- 17. 透明部分のない画像マスク
- 18. 画像のC++ブラーリング矩形部分
- 19. javafxの部分透過画像
- 20. 部分画像リンクの正規表現
- 21. ニューラルネットワークと画像の分類
- 22. OPENCVを使用して、画像の切り取った部分を別々の画像に抽出します
- 23. 画像は別の画像と別の画像が入っています
- 24. 画像部分の点を色の重みで選択する
- 25. Opencvは画像の部分のみを処理します
- 26. 画像の一部
- 27. iPhoneの部分を隠すUIScrollViewの画像の部分
- 28. 私は3枚の画像と、ブートストラップ上の行を作ってみる画像
- 29. 画像を複数回読み込むことなく画像を複数の部分にマスクする
- 30. 赤みがかったAndroid画面のスクリーンショットの画像
イメージにはポイントがありますか?これらの記述子を計算するのにどのような問題がありますか? – mmgp