0

本來只想探討Pillow histogram在人臉辨識的運用，卻扯出了一堆疑問….

"圖片差異比對"真的是有智慧的嗎? Is骨齡Bone Age 判讀intelligent ?

Question:

• Histogram()是什麼?
• 圖片尺寸大小會影響嗎? 類型?
• 放大縮小會影響嗎?
如果將同一張圖A，放大(縮小)成B，會有差異嗎?
在人類眼中AB兩張圖是一樣的(內容、構圖、顏色…一樣)，兩張圖如使用”直方圖”判斷，會不會說是’不一樣’?
Histogram是什麼?
The histogram() method provides information on counts of different colors/bands.

histogram() method returns a list of pixel counts for each band present in the image.
The list will have all the counts concatenated for each band.

If an image is of mode "RGB" then for each of band/color a list of pixel counts will be returned, totaling 768.

In other words, for an RGB image, the histogram() method gives information on how many kind of Red, Green and Blue pixels are present in the image for each 256 types of red, 256 types of green and 256 types of blue.

Pillow Image的’直方圖方法’，傳回的是各個顏色的”數量”。

Histogram() 是個list 長度768
print(f'type(picA.histogram()) : {type(picA.histogram())}')
type(picA.histogram()) : <class 'list'>
len(picA.histogram()): 768

r1, g1, b1 = picA.split()
print(type(r1.histogram()))

print(r1.histogram()[:5])
[15, 2, 11, 13, 26] Red 色階0出現15次，色階1出現2次，色階2出現11次….

1.選一張圖，當原尺寸 arrowA.jpg，另製作一張縮小成一半大小arrowB.jpg
2.可以切換兩種方式(原尺寸、相同尺寸)，試看看效果如何

``````# 可以切換兩種方式(原尺寸、相同尺寸)，試看看效果如何
# 調整成相同尺寸
picA, picB = imgResize(pic1,pic2)

# 依原始尺寸，不調整
#picA = pic1
#picB = pic2
``````

3.了解觀察histogram

Histogram() 是個list 長度768

print(f'type(picA.histogram()) : {type(picA.histogram())}')
print(f'len(picA.histogram()): {len(picA.histogram())}')

把紅色前5個色階的出現次數，印出來看看

print(r1.histogram()[:5])
print(len(r1.histogram()))
4.我們來看看picA的histogram 長得像什麼

``````#--- plot bar chart of picA.histogram
x = np.arange(0,256)
# 畫出 picA 三色 histogram
plt.title('picA histogram')
plt.bar(x, r1list,color='red')      #紅
plt.bar(x,g1list,color='green')     #綠
plt.bar(x,b1list,color='blue')      #藍
plt.show()
``````

5. 比較兩張圖片的histogram差異Histogram difference method:

``````#--- 兩圖RGB出現次數"直接相減"的簡單評估方法
#--- 計算 某一色階出現次數/此圖該色階出現次數平均值 之 比例%
#--- red scale
r1Avg = np.mean(r1list)
print(f'r1Avg {r1Avg}')
rr1 = []
for i in range(len(r1list)):
rr1.append(100*r1list[i] / r1Avg)
#print('rr1[:10]',rr1[:10])
rr2 = []
r2Avg = np.mean(r2list)
print(f'r2Avg {r2Avg}')
for j in range(len(r2list)):
rr2.append(100*r2list[j] / r2Avg)
rrD = []                          # 兩圖紅色差異
for j in range(len(r2list)):
rrD.append(abs(rr1[j]-rr2[j]))
#print('rrD different % : ',rrD[:10])

#--- 以下略...
``````

``````#--- 平方根的複雜計算式
def DiffSqrt(pic1,pic2):
h1 = pic1.histogram()
h2 = pic2.histogram()
list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1))
'''上一行意思： h1 h2相減-->平方-->平均-->再....-->再開平方根...
'''
# threshold 100，如果diff<=100，認定無差異
if(diff <= 100):
tmp = '兩張圖片 無差異'
else:
tmp = '兩張圖片 不相同'
print(f'{tmp}  diff = :  {diff}')
``````

''' 兩種方法測試結論：

'''

• 以這種方式(顏色差異)，如果只是圖片，或許還可以接受。
但是卻沒有考慮其它因素(特徵、構圖…)，這樣能運用在人臉的辨識嗎?
• 如果，虛擬產生一張圖片其中的histogram都符合目標圖片，也就騙過了程式?
( 改天再寫一個試看看 )
• 這樣是真正的有智慧嗎? Intelligent?

(註：男女孩骨頭發育時程不同，所以切換選男女)。

Why is that? 它內部真正的比對算法是?