- (1/8): 박스플랏: 전북고예제 (평균은 좋은 측정값인가?) (숫자 무시~~)

- (2/8): 박스플랏 기본개념

- (3/8): plotly

- (4/8): 히스토그램

- (5/8): 히스토그램 2개 겹쳐서 비교하기

- (7/8): 히스토그램 평활화

- (8/8): 히스토그램 평활화

import

import matplotlib.pyplot as plt
import numpy as np

boxplot

전북고예제: 평균은 괜찮은 측정값인가?

- 전북고등학교에서 통계학을 수업하는 두 선생님이 있다. 편의상 A선생님과 B선생님이라고 하자. A선생님이 강의한 반의 통계학 점수는 79.1점이고, B선생님이 강의한 반의 통계학 점수는 78.3점 이라고 하자.

- 의사결정: A선생님에게 배운 학생들의 실력이 평균적으로 좋을 것이다.

y1=[75,75,76,76,77,77,79,79,79,98] # A선생님에게 통계학을 배운 학생의 점수들
y2=[76,76,77,77,78,78,80,80,80,81] # B선생님에게 통계학을 배운 학생의 점수들 
np.mean(y1),np.mean(y2)
(79.1, 78.3)

- 평균은 A반(=A선생님에게 통계학을 배운 반)이 더 높다. 그런데 98점을 받은 학생때문에 전체평균이 올라간 것이고, 나머지 학생들은 전체적으로 B반 학생들이 점수가 더 높다고 해석할 수 있다.

- 단순한 평균비교보다 분포를 비교해보는 것이 중요하다. 분포를 살펴보는 방법 중 유용한 방법이 박스플랏이다.

plt.boxplot(y1)
{'whiskers': [<matplotlib.lines.Line2D at 0x7f6a8ef5e430>,
  <matplotlib.lines.Line2D at 0x7f6a8ef5e7c0>],
 'caps': [<matplotlib.lines.Line2D at 0x7f6a8ef5eb50>,
  <matplotlib.lines.Line2D at 0x7f6a8ef5eee0>],
 'boxes': [<matplotlib.lines.Line2D at 0x7f6a8ef5e0a0>],
 'medians': [<matplotlib.lines.Line2D at 0x7f6a8ef672b0>],
 'fliers': [<matplotlib.lines.Line2D at 0x7f6a8ef67640>],
 'means': []}
  • A반의 boxplot
  • 뚝 떨어진 하나의 점은 98점
  • 붉은 선은 중앙값 (평균이 아니라 중앙값)
  • 나머지 점들은 7~80점에 분포되어있다.
plt.boxplot(y2)
{'whiskers': [<matplotlib.lines.Line2D at 0x7f6a8eec0ac0>,
  <matplotlib.lines.Line2D at 0x7f6a8eec0e50>],
 'caps': [<matplotlib.lines.Line2D at 0x7f6a8eecc220>,
  <matplotlib.lines.Line2D at 0x7f6a8eecc5b0>],
 'boxes': [<matplotlib.lines.Line2D at 0x7f6a8eec0700>],
 'medians': [<matplotlib.lines.Line2D at 0x7f6a8eecc940>],
 'fliers': [<matplotlib.lines.Line2D at 0x7f6a8eecccd0>],
 'means': []}
  • B반의 boxplot

- 아래와 같이 하면 박스플랏을 나란히 그릴 수 있다.

plt.boxplot([y1,y2]) # 묶어주는 것 잊지 말기..
{'whiskers': [<matplotlib.lines.Line2D at 0x7f6a8eeb07c0>,
  <matplotlib.lines.Line2D at 0x7f6a8eeb0b50>,
  <matplotlib.lines.Line2D at 0x7f6a8ee47130>,
  <matplotlib.lines.Line2D at 0x7f6a8ee474c0>],
 'caps': [<matplotlib.lines.Line2D at 0x7f6a8eeb0ee0>,
  <matplotlib.lines.Line2D at 0x7f6a8ee3c2b0>,
  <matplotlib.lines.Line2D at 0x7f6a8ee47850>,
  <matplotlib.lines.Line2D at 0x7f6a8ee47be0>],
 'boxes': [<matplotlib.lines.Line2D at 0x7f6a8eeb0430>,
  <matplotlib.lines.Line2D at 0x7f6a8ee3cd60>],
 'medians': [<matplotlib.lines.Line2D at 0x7f6a8ee3c640>,
  <matplotlib.lines.Line2D at 0x7f6a8ee47f70>],
 'fliers': [<matplotlib.lines.Line2D at 0x7f6a8ee3c9d0>,
  <matplotlib.lines.Line2D at 0x7f6a8ee55340>],
 'means': []}

- 미적인 그래프는 아니지만 이정도는 괜찮은것 같다.

boxplot이란?

np.random.seed(916170)

# connection path is here: https://stackoverflow.com/questions/6146290/plotting-a-line-over-several-graphs
mu, sigma = 0, 1 # mean and standard deviation
s = np.random.normal(mu, sigma, 1000)

fig, axes = plt.subplots(nrows = 1, ncols = 1, figsize=(10, 5))

# rectangular box plot
bplot = axes.boxplot(s,
                vert=False,
                patch_artist=True, 
                showfliers=True, # This would show outliers (the remaining .7% of the data)
                positions = [0],
                boxprops = dict(linestyle='--', linewidth=2, color='Black', facecolor = 'red', alpha = .4),
                medianprops = dict(linestyle='-', linewidth=2, color='Yellow'),
                whiskerprops = dict(linestyle='-', linewidth=2, color='Blue', alpha = .4),
                capprops = dict(linestyle='-', linewidth=2, color='Black'),
                flierprops = dict(marker='o', markerfacecolor='green', markersize=10,
                  linestyle='none', alpha = .4),
                widths = .3,
                zorder = 1)   

axes.set_xlim(-4, 4)
plt.xticks(fontsize = 14)

axes.set_yticks([])
axes.annotate(r'',
            xy=(-.73, .205), xycoords='data',
            xytext=(.66, .205), textcoords='data',
            arrowprops=dict(arrowstyle="|-|",
                            connectionstyle="arc3")
            );

axes.text(0, .25, "Interquartile Range \n(IQR)",  horizontalalignment='center', fontsize=18)
axes.text(0, -.21, r"Median", horizontalalignment='center', fontsize=16);
axes.text(2.65, -.15, "\"Maximum\"", horizontalalignment='center', fontsize=18);
axes.text(-2.65, -.15, "\"Minimum\"", horizontalalignment='center', fontsize=18);
axes.text(-.68, -.24, r"Q1", horizontalalignment='center', fontsize=18);
axes.text(-2.65, -.21, r"(Q1 - 1.5*IQR)", horizontalalignment='center', fontsize=16);
axes.text(.6745, -.24, r"Q3", horizontalalignment='center', fontsize=18);
axes.text(.6745, -.30, r"(75th Percentile)", horizontalalignment='center', fontsize=12);
axes.text(-.68, -.30, r"(25th Percentile)", horizontalalignment='center', fontsize=12);
axes.text(2.65, -.21, r"(Q3 + 1.5*IQR)", horizontalalignment='center', fontsize=16);

axes.annotate('Outliers', xy=(2.93,0.015), xytext=(2.52,0.20), fontsize = 18,
            arrowprops={'arrowstyle': '->', 'color': 'black', 'lw': 2},
            va='center');

axes.annotate('Outliers', xy=(-3.01,0.015), xytext=(-3.41,0.20), fontsize = 18,
            arrowprops={'arrowstyle': '->', 'color': 'black', 'lw': 2},
            va='center');

fig.tight_layout()
  • 이상점은 동 떨어진 점들
  • 1사분위부터 3사분위까지 박스로 나타냄!
  • 1사분위수 - 1.5IQR부터 3사분위수 + 1.5IQR까지 선으로 나타냄

plotly

!pip install plotly 
!pip install ipywidgets
!pip install jupyter-dash
!pip install dash 
!pip install pandas
import plotly.express as px 
import pandas as pd
from IPython.display import HTML
A=pd.DataFrame({'score':y1,'class':['A']*len(y1)})
# score열에는 y1을 입력, class 열에는 A를 y1의 길이만큼 반복
B=pd.DataFrame({'score':y2,'class':['B']*len(y2)})
# score열에는 y2를 입력, class 열에는 B를 y2의 길이만큼 반복
df=pd.concat([A,B],ignore_index=True)
# ignore_index는 순서를 이어주는, 즉 각 데이터 셋의 순서 무시하기
df
score class
0 75 A
1 75 A
2 76 A
3 76 A
4 77 A
5 77 A
6 79 A
7 79 A
8 79 A
9 98 A
10 76 B
11 76 B
12 77 B
13 77 B
14 78 B
15 78 B
16 80 B
17 80 B
18 80 B
19 81 B
fig=px.box(data_frame=df, x='class',y='score')
HTML(fig.to_html(include_plotlyjs='cdn',include_mathjax=False))
# 이거 해줘야 블로그 같은 곳에 나타남/

histogram

히스토그램이란?

- X축이 변수의 구간, Y축은 그 구간에 포함된 빈도를 의미하는 그림

- 예를들면 아래와 같음

plt.hist(np.random.normal(loc=0, scale=1, size=1000000))
# 평균은 0이고 표준편차는 1인 1000000 사이즈의 랜덤 정규분포
(array([2.40000e+01, 1.21000e+03, 2.13380e+04, 1.39948e+05, 3.51614e+05,
        3.39662e+05, 1.27147e+05, 1.80510e+04, 9.87000e+02, 1.90000e+01]),
 array([-5.05590169, -4.03792348, -3.01994528, -2.00196708, -0.98398887,
         0.03398933,  1.05196753,  2.06994573,  3.08792394,  4.10590214,
         5.12388034]),
 <BarContainer object of 10 artists>)

전북고예제

- 중심경향값, 집중경향치 (Measure of central tendency): 분포의 중심성을 나타내기 위한 값, 예시로는 평균, 중앙값.

- '평균이 항상 좋은 중심경향값은 아니다.'라는 사실은 이해했음.

- 하지만 특수한 상황을 가정하면 평균이 좋은 중심경향값임

np.random.seed(43052)
y1=np.random.normal(loc=0,scale=1,size=10000) #전북고 A반의 통계학 성적이라 생각하자. 
y2=np.random.normal(loc=0.5,scale=1,size=10000) #전북고 B반의 통계학 성적이라 생각하자. 
np.mean(y1), np.mean(y2)
(-0.011790879905079434, 0.4979147460611458)
(np.mean(y2)-np.mean(y1)).round(3)
0.51
plt.boxplot([y1,y2])
{'whiskers': [<matplotlib.lines.Line2D at 0x7f6a86a419d0>,
  <matplotlib.lines.Line2D at 0x7f6a86a41d60>,
  <matplotlib.lines.Line2D at 0x7f6a86a59370>,
  <matplotlib.lines.Line2D at 0x7f6a86a59700>],
 'caps': [<matplotlib.lines.Line2D at 0x7f6a86a4f130>,
  <matplotlib.lines.Line2D at 0x7f6a86a4f4c0>,
  <matplotlib.lines.Line2D at 0x7f6a86a59a90>,
  <matplotlib.lines.Line2D at 0x7f6a86a59e20>],
 'boxes': [<matplotlib.lines.Line2D at 0x7f6a86a41640>,
  <matplotlib.lines.Line2D at 0x7f6a86a4ffa0>],
 'medians': [<matplotlib.lines.Line2D at 0x7f6a86a4f880>,
  <matplotlib.lines.Line2D at 0x7f6a86a651f0>],
 'fliers': [<matplotlib.lines.Line2D at 0x7f6a86a4fc10>,
  <matplotlib.lines.Line2D at 0x7f6a86a65580>],
 'means': []}
  • 분포의 모양이 거의 비슷하고, 왼쪽그림을 거의 컨트롤+C,V 오른쪽에 붙인다음 위치조정을 한 느낌
  • 이런상황에서는 $B반의 성적 \approx A반의 성적 + 0.51$ 라고 주장해도 큰 무리가 없음.

- 정규분포인것은 어떻게 아는가? $\to$ 히스토그램을 그려보아서 종 모양이 나오는지 살펴보자.

plt.hist(y1,bins=50)
# 50개의 구간으로 나누어서 히스토그램을 그릴것
(array([  1.,   1.,   3.,   0.,   1.,   4.,   5.,  12.,  14.,  26.,  32.,
         52.,  67.,  89., 144., 171., 238., 282., 325., 378., 489., 492.,
        561., 635., 652., 636., 626., 606., 573., 539., 475., 444., 350.,
        250., 232., 172., 137.,  80.,  58.,  47.,  30.,  23.,  17.,  12.,
          9.,   4.,   4.,   0.,   1.,   1.]),
 array([-4.12186916, -3.96068404, -3.79949892, -3.6383138 , -3.47712868,
        -3.31594356, -3.15475844, -2.99357332, -2.8323882 , -2.67120308,
        -2.51001796, -2.34883284, -2.18764772, -2.0264626 , -1.86527748,
        -1.70409236, -1.54290724, -1.38172212, -1.220537  , -1.05935188,
        -0.89816676, -0.73698164, -0.57579652, -0.4146114 , -0.25342628,
        -0.09224116,  0.06894396,  0.23012908,  0.3913142 ,  0.55249932,
         0.71368444,  0.87486956,  1.03605468,  1.1972398 ,  1.35842492,
         1.51961004,  1.68079516,  1.84198028,  2.0031654 ,  2.16435052,
         2.32553564,  2.48672076,  2.64790588,  2.809091  ,  2.97027612,
         3.13146124,  3.29264636,  3.45383148,  3.6150166 ,  3.77620172,
         3.93738684]),
 <BarContainer object of 50 artists>)
plt.hist(y2,bins=50)
(array([  1.,   0.,   3.,   2.,   4.,   5.,   5.,  10.,  16.,  25.,  33.,
         56.,  74., 116., 119., 152., 244., 272., 351., 362., 438., 509.,
        531., 621., 624., 690., 636., 571., 564., 514., 462., 402., 356.,
        297., 233., 184., 144., 113.,  80.,  55.,  38.,  34.,  21.,  18.,
          4.,   3.,   2.,   4.,   1.,   1.]),
 array([-3.5752867 , -3.4164866 , -3.2576865 , -3.0988864 , -2.9400863 ,
        -2.7812862 , -2.6224861 , -2.463686  , -2.3048859 , -2.1460858 ,
        -1.9872857 , -1.8284856 , -1.6696855 , -1.5108854 , -1.3520853 ,
        -1.1932852 , -1.0344851 , -0.875685  , -0.7168849 , -0.5580848 ,
        -0.3992847 , -0.2404846 , -0.0816845 ,  0.0771156 ,  0.2359157 ,
         0.3947158 ,  0.5535159 ,  0.712316  ,  0.87111611,  1.02991621,
         1.18871631,  1.34751641,  1.50631651,  1.66511661,  1.82391671,
         1.98271681,  2.14151691,  2.30031701,  2.45911711,  2.61791721,
         2.77671731,  2.93551741,  3.09431751,  3.25311761,  3.41191771,
         3.57071781,  3.72951791,  3.88831801,  4.04711811,  4.20591821,
         4.36471831]),
 <BarContainer object of 50 artists>)
plt.hist([y1,y2],bins=200) # 히스토그램 겹쳐 그리기
(array([[  1.,   0.,   0.,   0.,   0.,   0.,   1.,   0.,   1.,   1.,   1.,
           0.,   0.,   0.,   0.,   0.,   0.,   1.,   0.,   1.,   1.,   2.,
           1.,   0.,   1.,   1.,   3.,   4.,   4.,   2.,   2.,   6.,   4.,
           1.,   4.,   7.,   8.,   9.,  11.,   5.,   9.,   9.,  14.,  12.,
          16.,  11.,   9.,  18.,  25.,  30.,  22.,  18.,  28.,  29.,  39.,
          40.,  41.,  37.,  42.,  48.,  56.,  58.,  49.,  80.,  62.,  62.,
          91.,  78.,  75.,  82.,  89.,  81., 106.,  85.,  89., 126., 125.,
         106., 142., 141., 121., 121., 135., 154., 166., 146., 125., 169.,
         160., 170., 172., 162., 161., 161., 193., 146., 186., 170., 166.,
         197., 152., 149., 167., 173., 158., 155., 156., 153., 152., 137.,
         151., 147., 126., 141., 125., 139., 117., 116., 135., 118.,  93.,
         115.,  99.,  78.,  91.,  77.,  63.,  81.,  52.,  83.,  53.,  61.,
          49.,  46.,  46.,  47.,  45.,  26.,  48.,  31.,  27.,  27.,  20.,
          17.,  22.,  15.,  15.,  14.,  14.,  15.,  10.,   8.,  13.,   7.,
           5.,   8.,   6.,   6.,   6.,   2.,   4.,   9.,   3.,   3.,   6.,
           2.,   1.,   4.,   2.,   2.,   2.,   2.,   0.,   1.,   1.,   2.,
           2.,   0.,   0.,   0.,   0.,   0.,   0.,   1.,   0.,   0.,   0.,
           0.,   0.,   1.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
           0.,   0.],
        [  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
           0.,   1.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   1.,
           1.,   1.,   0.,   1.,   0.,   1.,   1.,   1.,   0.,   3.,   1.,
           2.,   1.,   1.,   1.,   2.,   1.,   2.,   2.,   1.,   6.,   1.,
           6.,   3.,   7.,   7.,   5.,   6.,  10.,   5.,   7.,  16.,   9.,
          11.,  13.,  28.,  21.,  16.,  20.,  27.,  25.,  32.,  33.,  28.,
          31.,  31.,  39.,  42.,  34.,  43.,  44.,  64.,  56.,  80.,  64.,
          74.,  77.,  69.,  82.,  92., 101.,  99.,  81.,  90., 115., 110.,
         106., 108., 127., 127., 138., 145., 138., 121., 159., 135., 145.,
         156., 186., 158., 164., 172., 182., 147., 194., 178., 176., 195.,
         162., 182., 164., 164., 163., 145., 150., 143., 155., 144., 142.,
         161., 141., 146., 129., 115., 132., 120., 118., 128., 103.,  88.,
         111., 104.,  97.,  82.,  77.,  83.,  83.,  80.,  77.,  67.,  58.,
          48.,  47.,  54.,  50.,  43.,  36.,  43.,  33.,  33.,  42.,  29.,
          24.,  28.,  19.,  22.,  16.,  18.,  14.,  14.,  11.,  10.,   9.,
           7.,  12.,  10.,   8.,   8.,   9.,   4.,   7.,   4.,   6.,   3.,
           8.,   1.,   1.,   1.,   0.,   1.,   0.,   2.,   1.,   0.,   2.,
           0.,   0.,   2.,   2.,   0.,   0.,   0.,   0.,   1.,   0.,   0.,
           0.,   1.]]),
 array([-4.12186916, -4.07943623, -4.03700329, -3.99457035, -3.95213741,
        -3.90970448, -3.86727154, -3.8248386 , -3.78240567, -3.73997273,
        -3.69753979, -3.65510685, -3.61267392, -3.57024098, -3.52780804,
        -3.4853751 , -3.44294217, -3.40050923, -3.35807629, -3.31564335,
        -3.27321042, -3.23077748, -3.18834454, -3.1459116 , -3.10347867,
        -3.06104573, -3.01861279, -2.97617986, -2.93374692, -2.89131398,
        -2.84888104, -2.80644811, -2.76401517, -2.72158223, -2.67914929,
        -2.63671636, -2.59428342, -2.55185048, -2.50941754, -2.46698461,
        -2.42455167, -2.38211873, -2.33968579, -2.29725286, -2.25481992,
        -2.21238698, -2.16995405, -2.12752111, -2.08508817, -2.04265523,
        -2.0002223 , -1.95778936, -1.91535642, -1.87292348, -1.83049055,
        -1.78805761, -1.74562467, -1.70319173, -1.6607588 , -1.61832586,
        -1.57589292, -1.53345998, -1.49102705, -1.44859411, -1.40616117,
        -1.36372824, -1.3212953 , -1.27886236, -1.23642942, -1.19399649,
        -1.15156355, -1.10913061, -1.06669767, -1.02426474, -0.9818318 ,
        -0.93939886, -0.89696592, -0.85453299, -0.81210005, -0.76966711,
        -0.72723417, -0.68480124, -0.6423683 , -0.59993536, -0.55750243,
        -0.51506949, -0.47263655, -0.43020361, -0.38777068, -0.34533774,
        -0.3029048 , -0.26047186, -0.21803893, -0.17560599, -0.13317305,
        -0.09074011, -0.04830718, -0.00587424,  0.0365587 ,  0.07899164,
         0.12142457,  0.16385751,  0.20629045,  0.24872338,  0.29115632,
         0.33358926,  0.3760222 ,  0.41845513,  0.46088807,  0.50332101,
         0.54575395,  0.58818688,  0.63061982,  0.67305276,  0.7154857 ,
         0.75791863,  0.80035157,  0.84278451,  0.88521744,  0.92765038,
         0.97008332,  1.01251626,  1.05494919,  1.09738213,  1.13981507,
         1.18224801,  1.22468094,  1.26711388,  1.30954682,  1.35197976,
         1.39441269,  1.43684563,  1.47927857,  1.52171151,  1.56414444,
         1.60657738,  1.64901032,  1.69144325,  1.73387619,  1.77630913,
         1.81874207,  1.861175  ,  1.90360794,  1.94604088,  1.98847382,
         2.03090675,  2.07333969,  2.11577263,  2.15820557,  2.2006385 ,
         2.24307144,  2.28550438,  2.32793732,  2.37037025,  2.41280319,
         2.45523613,  2.49766906,  2.540102  ,  2.58253494,  2.62496788,
         2.66740081,  2.70983375,  2.75226669,  2.79469963,  2.83713256,
         2.8795655 ,  2.92199844,  2.96443138,  3.00686431,  3.04929725,
         3.09173019,  3.13416313,  3.17659606,  3.219029  ,  3.26146194,
         3.30389487,  3.34632781,  3.38876075,  3.43119369,  3.47362662,
         3.51605956,  3.5584925 ,  3.60092544,  3.64335837,  3.68579131,
         3.72822425,  3.77065719,  3.81309012,  3.85552306,  3.897956  ,
         3.94038894,  3.98282187,  4.02525481,  4.06768775,  4.11012068,
         4.15255362,  4.19498656,  4.2374195 ,  4.27985243,  4.32228537,
         4.36471831]),
 <a list of 2 BarContainer objects>)

seaborn

import seaborn as sns 
A=pd.DataFrame({'score':y1,'class':['A']*len(y1)})
B=pd.DataFrame({'score':y2,'class':['B']*len(y2)})
df=pd.concat([A,B],ignore_index=True)
sns.histplot(df,x='score',hue='class')
<AxesSubplot:xlabel='score', ylabel='Count'>

plotnine

from plotnine import *
ggplot(df)+geom_histogram(aes(x='score',fill='class'),position='identity',alpha=0.5)
/home/cgb4/anaconda3/envs/csy/lib/python3.8/site-packages/plotnine/stats/stat_bin.py:95: PlotnineWarning: 'stat_bin()' using 'bins = 84'. Pick better value with 'binwidth'.
<ggplot: (8755886288517)>

plotly

- 인터랙티브 그래프를 위해서 plotly 홈페이지를 방문하여 적당한 코드를 가져온다.

import plotly.figure_factory as ff
import numpy as np
hist_data=[y1,y2]
group_labels=['A','B']

fig = ff.create_distplot(hist_data, group_labels,bin_size=.2, show_rug=False)
HTML(fig.to_html(include_plotlyjs='cdn',include_mathjax=False))

[숙제1]

(1) 자기학번으로 np.random.seed(202043052)를 만들고

(2) y1, y2 // 10만개의 정규분포를 생성해서 저장

  • y1: 평균 0, 표준편차=1
  • y2: 평균 1, 표준편차=1

(3) plotly 를 활용하여 히스토그램을 겹쳐서 그려보는것.

np.random.seed(202150754)
y1=np.random.normal(loc=0,scale=1,size=100000)
y2=np.random.normal(loc=1,scale=1,size=100000)
plt.hist([y1,y2],bins=200)
(array([[1.000e+00, 0.000e+00, 2.000e+00, 1.000e+00, 0.000e+00, 4.000e+00,
         0.000e+00, 1.000e+00, 2.000e+00, 4.000e+00, 2.000e+00, 1.000e+00,
         7.000e+00, 1.000e+00, 7.000e+00, 6.000e+00, 7.000e+00, 9.000e+00,
         1.200e+01, 4.000e+00, 1.100e+01, 1.500e+01, 1.800e+01, 1.900e+01,
         2.900e+01, 3.500e+01, 3.300e+01, 3.700e+01, 5.100e+01, 5.100e+01,
         6.800e+01, 6.900e+01, 8.300e+01, 8.400e+01, 8.700e+01, 9.400e+01,
         1.140e+02, 1.360e+02, 1.450e+02, 1.580e+02, 1.840e+02, 1.850e+02,
         2.180e+02, 2.580e+02, 2.700e+02, 2.850e+02, 2.990e+02, 3.320e+02,
         3.800e+02, 4.060e+02, 4.270e+02, 5.110e+02, 4.850e+02, 5.380e+02,
         6.160e+02, 6.140e+02, 6.540e+02, 7.110e+02, 8.180e+02, 8.170e+02,
         8.610e+02, 9.200e+02, 8.990e+02, 9.870e+02, 1.033e+03, 1.116e+03,
         1.152e+03, 1.177e+03, 1.252e+03, 1.302e+03, 1.382e+03, 1.430e+03,
         1.494e+03, 1.466e+03, 1.572e+03, 1.596e+03, 1.597e+03, 1.632e+03,
         1.671e+03, 1.699e+03, 1.755e+03, 1.820e+03, 1.760e+03, 1.796e+03,
         1.834e+03, 1.800e+03, 1.936e+03, 1.901e+03, 1.821e+03, 1.899e+03,
         1.803e+03, 1.722e+03, 1.673e+03, 1.756e+03, 1.743e+03, 1.728e+03,
         1.697e+03, 1.693e+03, 1.594e+03, 1.506e+03, 1.486e+03, 1.529e+03,
         1.438e+03, 1.392e+03, 1.394e+03, 1.304e+03, 1.286e+03, 1.232e+03,
         1.129e+03, 1.138e+03, 1.029e+03, 1.005e+03, 9.240e+02, 8.700e+02,
         8.540e+02, 8.140e+02, 7.090e+02, 7.270e+02, 6.440e+02, 5.890e+02,
         5.790e+02, 5.650e+02, 4.890e+02, 4.300e+02, 4.550e+02, 4.110e+02,
         3.190e+02, 3.450e+02, 2.970e+02, 2.880e+02, 2.530e+02, 2.410e+02,
         2.000e+02, 1.730e+02, 1.620e+02, 1.540e+02, 1.570e+02, 1.320e+02,
         1.120e+02, 9.500e+01, 8.100e+01, 8.600e+01, 8.200e+01, 7.200e+01,
         6.700e+01, 4.400e+01, 4.500e+01, 4.500e+01, 2.800e+01, 2.000e+01,
         2.400e+01, 2.800e+01, 2.000e+01, 2.500e+01, 8.000e+00, 1.500e+01,
         1.000e+01, 7.000e+00, 1.000e+01, 7.000e+00, 3.000e+00, 9.000e+00,
         4.000e+00, 3.000e+00, 3.000e+00, 1.000e+00, 4.000e+00, 1.000e+00,
         0.000e+00, 1.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 1.000e+00,
         0.000e+00, 2.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 0.000e+00,
         0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
         0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
         0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
         0.000e+00, 0.000e+00],
        [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
         0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00,
         0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.000e+00, 1.000e+00,
         0.000e+00, 0.000e+00, 0.000e+00, 1.000e+00, 1.000e+00, 0.000e+00,
         2.000e+00, 1.000e+00, 1.000e+00, 2.000e+00, 1.000e+00, 1.000e+00,
         3.000e+00, 3.000e+00, 2.000e+00, 3.000e+00, 6.000e+00, 3.000e+00,
         9.000e+00, 1.000e+01, 1.100e+01, 6.000e+00, 9.000e+00, 1.300e+01,
         1.800e+01, 1.500e+01, 1.600e+01, 3.600e+01, 2.300e+01, 2.800e+01,
         3.300e+01, 4.300e+01, 6.500e+01, 6.000e+01, 7.000e+01, 7.600e+01,
         7.000e+01, 6.600e+01, 9.400e+01, 1.060e+02, 1.300e+02, 1.440e+02,
         1.430e+02, 1.630e+02, 1.900e+02, 1.890e+02, 2.410e+02, 2.540e+02,
         2.720e+02, 2.990e+02, 3.860e+02, 3.220e+02, 3.970e+02, 4.100e+02,
         4.230e+02, 4.590e+02, 5.070e+02, 5.340e+02, 6.230e+02, 6.520e+02,
         7.010e+02, 6.890e+02, 7.730e+02, 7.950e+02, 8.880e+02, 9.260e+02,
         9.080e+02, 1.016e+03, 1.065e+03, 1.098e+03, 1.203e+03, 1.194e+03,
         1.307e+03, 1.287e+03, 1.367e+03, 1.408e+03, 1.528e+03, 1.516e+03,
         1.550e+03, 1.615e+03, 1.593e+03, 1.610e+03, 1.730e+03, 1.784e+03,
         1.786e+03, 1.804e+03, 1.800e+03, 1.802e+03, 1.748e+03, 1.817e+03,
         1.796e+03, 1.862e+03, 1.837e+03, 1.776e+03, 1.794e+03, 1.798e+03,
         1.770e+03, 1.723e+03, 1.779e+03, 1.712e+03, 1.688e+03, 1.694e+03,
         1.524e+03, 1.563e+03, 1.566e+03, 1.514e+03, 1.405e+03, 1.329e+03,
         1.360e+03, 1.286e+03, 1.271e+03, 1.131e+03, 1.146e+03, 1.054e+03,
         1.044e+03, 9.620e+02, 9.050e+02, 9.360e+02, 8.110e+02, 8.290e+02,
         7.080e+02, 7.530e+02, 6.310e+02, 6.010e+02, 5.700e+02, 5.130e+02,
         5.080e+02, 4.610e+02, 4.150e+02, 3.810e+02, 3.520e+02, 3.380e+02,
         3.040e+02, 2.550e+02, 2.550e+02, 2.160e+02, 2.090e+02, 1.810e+02,
         1.650e+02, 1.430e+02, 1.410e+02, 1.200e+02, 1.080e+02, 8.400e+01,
         9.200e+01, 7.800e+01, 7.500e+01, 7.500e+01, 5.500e+01, 4.300e+01,
         4.700e+01, 4.200e+01, 4.300e+01, 3.700e+01, 1.900e+01, 3.000e+01,
         2.100e+01, 1.800e+01, 1.400e+01, 8.000e+00, 1.400e+01, 1.100e+01,
         7.000e+00, 5.000e+00, 7.000e+00, 4.000e+00, 5.000e+00, 2.000e+00,
         2.000e+00, 4.000e+00, 3.000e+00, 1.000e+00, 0.000e+00, 0.000e+00,
         1.000e+00, 2.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00,
         0.000e+00, 1.000e+00]]),
 array([-4.03250572, -3.98635668, -3.94020763, -3.89405858, -3.84790954,
        -3.80176049, -3.75561144, -3.7094624 , -3.66331335, -3.6171643 ,
        -3.57101526, -3.52486621, -3.47871716, -3.43256812, -3.38641907,
        -3.34027002, -3.29412098, -3.24797193, -3.20182288, -3.15567384,
        -3.10952479, -3.06337574, -3.0172267 , -2.97107765, -2.92492861,
        -2.87877956, -2.83263051, -2.78648147, -2.74033242, -2.69418337,
        -2.64803433, -2.60188528, -2.55573623, -2.50958719, -2.46343814,
        -2.41728909, -2.37114005, -2.324991  , -2.27884195, -2.23269291,
        -2.18654386, -2.14039481, -2.09424577, -2.04809672, -2.00194767,
        -1.95579863, -1.90964958, -1.86350053, -1.81735149, -1.77120244,
        -1.7250534 , -1.67890435, -1.6327553 , -1.58660626, -1.54045721,
        -1.49430816, -1.44815912, -1.40201007, -1.35586102, -1.30971198,
        -1.26356293, -1.21741388, -1.17126484, -1.12511579, -1.07896674,
        -1.0328177 , -0.98666865, -0.9405196 , -0.89437056, -0.84822151,
        -0.80207246, -0.75592342, -0.70977437, -0.66362533, -0.61747628,
        -0.57132723, -0.52517819, -0.47902914, -0.43288009, -0.38673105,
        -0.340582  , -0.29443295, -0.24828391, -0.20213486, -0.15598581,
        -0.10983677, -0.06368772, -0.01753867,  0.02861037,  0.07475942,
         0.12090847,  0.16705751,  0.21320656,  0.25935561,  0.30550465,
         0.3516537 ,  0.39780274,  0.44395179,  0.49010084,  0.53624988,
         0.58239893,  0.62854798,  0.67469702,  0.72084607,  0.76699512,
         0.81314416,  0.85929321,  0.90544226,  0.9515913 ,  0.99774035,
         1.0438894 ,  1.09003844,  1.13618749,  1.18233654,  1.22848558,
         1.27463463,  1.32078368,  1.36693272,  1.41308177,  1.45923081,
         1.50537986,  1.55152891,  1.59767795,  1.643827  ,  1.68997605,
         1.73612509,  1.78227414,  1.82842319,  1.87457223,  1.92072128,
         1.96687033,  2.01301937,  2.05916842,  2.10531747,  2.15146651,
         2.19761556,  2.24376461,  2.28991365,  2.3360627 ,  2.38221175,
         2.42836079,  2.47450984,  2.52065889,  2.56680793,  2.61295698,
         2.65910602,  2.70525507,  2.75140412,  2.79755316,  2.84370221,
         2.88985126,  2.9360003 ,  2.98214935,  3.0282984 ,  3.07444744,
         3.12059649,  3.16674554,  3.21289458,  3.25904363,  3.30519268,
         3.35134172,  3.39749077,  3.44363982,  3.48978886,  3.53593791,
         3.58208696,  3.628236  ,  3.67438505,  3.72053409,  3.76668314,
         3.81283219,  3.85898123,  3.90513028,  3.95127933,  3.99742837,
         4.04357742,  4.08972647,  4.13587551,  4.18202456,  4.22817361,
         4.27432265,  4.3204717 ,  4.36662075,  4.41276979,  4.45891884,
         4.50506789,  4.55121693,  4.59736598,  4.64351503,  4.68966407,
         4.73581312,  4.78196216,  4.82811121,  4.87426026,  4.9204093 ,
         4.96655835,  5.0127074 ,  5.05885644,  5.10500549,  5.15115454,
         5.19730358]),
 <a list of 2 BarContainer objects>)

Histogram Equalization, HE

- 히스토그램 평활화: 이미지의 명암대비 개선

!pip install opencv-python
import cv2 as cv
import matplotlib.pyplot as plt 
import pandas as pd 
img = cv.imread('Unequalized_Hawkes_Bay_NZ.jpg',0)
plt.imshow(img,cmap='gray',vmin=0,vmax=255)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f6a713a2280>

- 이미지자료는 사실 0~255 사이의 어떠한 숫자들이 포함된 매트릭스일 뿐이다.

img
array([[127, 145, 149, ..., 168, 167, 166],
       [165, 152, 143, ..., 168, 169, 168],
       [171, 145, 140, ..., 156, 154, 151],
       ...,
       [147, 132, 134, ..., 146, 145, 144],
       [146, 130, 132, ..., 146, 145, 144],
       [145, 128, 129, ..., 146, 145, 144]], dtype=uint8)
  • 확인: 이미지가 있다고 믿었던 img는 그냥 넘파이 매트릭스
  • 위의 매트릭스에 있는 숫자들을 색깔로 표현하여 값이 클수록 하얗게, 값이 작을수록 검게 그린다. 극단적으로 0은 검은색, 255는 흰색이다.

- 이미지가 넘파이 매트릭스일 뿐이라는 것을 판다스를 활용하면 더 잘 시각화하여 이해할 수 있다.

plt.imshow(img[200:300,400:500],cmap='gray',vmin=0,vmax=255)
<matplotlib.image.AxesImage at 0x7fb294190bb0>
df=pd.DataFrame(img)
df.iloc[200:300,400:500].style.set_properties(**{'font-size':'10pt'}).background_gradient('gray',vmin=0,vmax=255)
  400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
200 155 155 151 149 152 152 151 152 152 152 152 153 154 155 157 158 164 157 150 148 146 143 139 138 138 140 142 140 138 137 137 137 131 142 147 143 143 150 153 151 149 148 146 143 141 141 142 143 143 143 140 138 137 138 136 133 133 134 133 131 128 127 129 131 128 129 132 129 130 129 125 131 128 128 128 130 132 133 132 131 137 136 135 138 140 133 127 129 132 130 130 132 135 135 134 134 137 138 137 134
201 139 148 152 149 145 142 147 156 150 152 154 154 153 153 155 157 158 159 155 149 144 142 139 136 138 139 140 139 137 136 136 137 141 140 139 141 147 152 152 150 151 150 149 147 145 143 143 143 141 142 142 141 141 141 138 134 133 132 132 131 130 131 133 135 128 128 132 130 132 131 126 132 129 129 128 129 130 132 132 133 137 135 132 133 134 129 126 130 129 129 131 133 134 133 134 136 136 137 137 135
202 138 145 149 149 149 144 138 139 144 148 153 155 153 152 153 155 153 158 157 147 140 140 139 136 137 135 135 137 137 135 134 136 142 138 139 145 147 144 145 151 150 150 151 150 149 147 145 143 140 140 140 140 140 141 139 135 133 131 129 128 129 130 132 133 128 128 131 131 134 133 128 133 132 132 131 130 129 131 133 135 133 132 129 129 132 131 133 140 135 136 137 137 134 131 131 134 135 136 136 136
203 152 151 148 150 156 152 141 134 137 141 147 151 152 152 153 154 152 155 153 144 137 138 139 139 134 130 130 134 135 133 133 136 133 132 137 146 147 141 141 147 146 147 148 149 150 149 147 145 143 142 140 137 137 139 139 137 136 133 129 127 127 128 128 128 129 127 130 129 133 134 130 136 136 136 134 132 130 131 133 135 132 133 132 133 137 137 140 147 144 143 142 140 137 133 134 136 136 136 135 135
204 155 156 153 151 153 153 152 155 141 141 142 144 147 149 151 151 153 152 149 145 140 137 138 140 133 130 129 131 132 131 132 134 130 127 130 139 147 147 144 141 144 144 144 146 147 147 147 146 147 146 143 140 139 140 139 137 138 134 130 127 128 129 129 128 129 127 129 127 131 134 131 139 139 138 136 133 131 130 132 134 137 140 141 141 143 140 139 143 145 141 138 139 140 141 142 144 138 136 134 133
205 145 151 152 153 154 152 152 156 151 147 141 139 141 144 147 148 151 149 149 148 145 138 135 136 134 133 131 130 130 130 131 132 134 133 134 136 139 142 143 143 145 144 142 143 144 145 144 144 146 146 145 143 141 140 137 133 134 131 127 126 128 129 130 129 129 128 130 127 130 133 132 141 140 138 136 133 130 130 132 133 139 143 143 143 145 141 137 139 144 138 134 136 141 144 145 145 141 137 134 134
206 143 147 149 151 155 152 146 145 154 151 146 143 142 143 144 145 144 146 147 146 142 138 136 134 133 135 134 130 129 132 134 134 135 136 137 136 133 135 142 150 147 145 143 143 144 145 144 143 145 145 144 142 141 140 136 132 130 128 126 126 127 128 129 129 129 129 131 129 130 133 133 143 143 139 135 132 131 132 134 136 138 141 140 139 142 141 139 140 143 137 133 136 141 143 143 142 143 139 136 136
207 148 151 150 149 151 150 149 151 150 150 151 150 148 145 144 144 137 144 145 139 135 137 138 135 131 136 136 130 129 135 138 137 134 129 128 132 137 140 146 153 147 145 144 144 145 146 145 143 147 147 144 142 141 141 139 136 132 131 129 128 128 128 128 129 128 130 133 131 131 133 133 144 145 141 135 132 132 135 138 140 141 141 137 135 139 140 139 140 139 135 133 136 141 143 143 143 144 140 137 138
208 150 148 151 145 143 147 148 153 158 153 150 152 149 143 141 144 145 145 144 142 140 137 133 131 130 133 131 130 137 143 140 135 141 139 130 134 147 142 135 144 147 143 146 148 144 146 149 144 148 144 140 141 143 144 141 137 132 128 126 127 128 127 125 125 128 127 129 135 138 138 138 139 138 133 129 130 133 135 138 140 140 136 135 137 138 136 136 139 139 137 137 138 139 140 141 143 141 144 143 143
209 153 147 147 143 144 147 144 146 150 149 150 152 153 151 146 143 142 142 141 139 137 135 134 134 133 131 130 129 130 132 134 133 136 139 137 130 132 146 151 142 145 146 153 156 154 156 156 149 145 148 149 148 143 140 139 140 143 137 130 125 122 122 126 129 128 128 129 132 137 139 139 137 133 130 129 133 138 139 137 135 140 136 134 136 136 133 132 135 137 136 136 137 136 136 137 140 137 140 139 139
210 154 147 147 145 145 145 141 145 143 145 147 149 153 155 151 144 144 143 141 139 137 136 137 137 136 130 132 135 129 129 133 133 137 128 138 144 135 141 149 139 141 142 146 146 145 152 155 150 145 145 144 144 144 143 141 140 142 139 135 132 127 124 125 127 126 126 127 128 133 137 136 133 132 130 131 137 143 142 138 134 138 135 134 136 136 134 134 135 135 135 136 137 135 134 136 140 137 140 139 138
211 153 149 152 151 148 146 143 150 143 143 143 145 148 150 150 148 149 146 142 140 139 139 138 137 137 131 137 143 137 139 141 134 145 129 145 167 157 144 144 140 139 142 143 140 141 149 153 151 148 145 141 141 142 143 142 141 139 138 139 139 135 129 124 122 125 124 124 127 130 132 133 134 133 131 132 137 140 140 137 135 138 135 133 134 134 133 134 135 133 134 136 136 135 134 136 140 139 141 139 139
212 156 151 153 151 150 149 145 149 147 144 144 146 146 143 144 149 149 144 139 138 139 139 136 132 136 132 138 142 141 147 147 132 137 136 145 155 154 147 141 135 133 140 142 141 144 148 148 147 149 151 152 149 143 140 141 144 146 142 140 139 137 133 129 127 127 123 124 128 130 127 130 135 130 131 133 136 136 134 134 134 138 135 132 131 131 131 131 133 131 132 134 135 133 131 134 137 135 139 137 136
213 160 152 151 149 151 153 145 142 148 145 146 150 148 141 141 147 146 142 137 137 139 139 135 131 134 132 134 134 136 144 143 131 128 132 130 129 134 138 137 137 132 138 138 137 141 143 144 147 148 150 151 152 150 148 145 144 145 142 140 142 143 141 139 137 129 125 123 126 127 125 127 131 129 131 135 138 137 134 133 134 135 133 132 132 133 135 136 138 135 135 136 136 134 132 132 135 133 137 136 134
214 160 157 157 150 150 153 146 143 146 146 147 149 147 144 143 144 144 142 138 137 138 137 136 134 132 133 133 132 132 135 136 133 131 130 129 131 133 135 139 146 140 142 138 137 141 141 142 152 147 144 143 147 153 155 151 147 142 142 143 146 148 146 143 142 134 132 127 124 126 129 128 124 130 131 134 137 137 134 133 134 135 134 134 135 137 140 141 142 138 137 138 138 136 134 133 135 134 140 139 135
215 157 162 167 156 148 151 149 151 145 145 145 143 144 146 146 143 143 142 139 137 135 134 134 135 130 134 136 136 134 130 131 138 128 130 138 141 136 138 143 140 137 140 138 140 143 137 134 143 147 147 146 147 148 150 153 155 149 147 146 146 143 141 141 143 141 141 133 124 128 137 134 122 129 128 129 131 132 132 132 133 138 138 138 138 138 139 138 137 137 136 136 137 136 134 133 134 136 142 141 136
216 156 146 149 163 166 153 146 152 145 144 143 144 145 145 143 141 139 141 136 133 138 136 130 131 131 132 136 137 134 130 130 132 132 135 126 136 141 137 146 141 135 137 138 141 143 138 137 143 146 146 146 148 149 145 143 148 147 147 146 144 142 141 140 140 142 143 143 144 144 143 140 138 123 126 137 137 141 131 133 132 138 141 137 135 138 135 132 137 137 135 135 137 136 132 131 134 134 137 139 137
217 155 156 158 158 159 158 154 148 150 146 142 143 145 145 142 138 136 135 131 132 137 138 135 133 136 131 129 130 132 131 128 127 143 144 130 132 134 132 144 141 134 138 138 136 137 136 135 138 132 144 151 146 144 150 152 147 142 143 143 143 143 142 142 142 144 144 144 145 146 146 146 145 136 133 132 135 136 136 133 133 133 134 133 135 139 138 135 135 134 133 134 136 134 129 129 132 133 134 135 135
218 153 161 162 156 157 164 164 156 152 150 148 145 142 141 141 141 141 135 132 133 135 136 135 130 135 130 127 128 130 129 127 124 139 145 136 135 134 132 139 132 132 139 137 132 134 136 137 137 135 141 154 158 153 152 151 144 142 142 143 142 142 140 139 138 144 143 142 142 142 143 144 145 144 138 127 134 132 138 129 127 131 127 129 135 138 137 135 130 130 131 132 134 131 127 127 131 134 134 134 135
219 153 155 157 158 159 161 164 165 157 155 151 147 144 142 142 142 148 139 137 136 132 131 132 126 129 130 131 131 130 128 126 126 127 137 136 136 135 134 136 127 131 136 136 134 137 139 138 140 133 133 146 155 150 150 152 145 143 142 141 140 139 138 136 135 142 141 140 138 137 137 137 138 152 147 139 143 142 144 135 130 131 125 128 135 134 134 134 129 131 132 134 134 131 128 130 135 133 133 134 136
220 151 151 153 157 157 156 158 162 164 159 153 150 150 148 144 140 145 137 137 137 130 129 131 129 127 129 131 131 130 129 128 128 125 134 133 130 129 132 136 130 130 133 134 137 140 136 134 137 137 146 156 151 140 147 154 144 141 139 138 137 137 137 137 136 138 138 139 138 137 136 136 137 147 146 149 145 148 142 141 136 136 130 133 138 133 131 134 133 133 135 136 136 133 132 135 140 131 132 133 134
221 147 151 154 154 155 158 160 159 161 164 164 160 152 146 144 145 142 137 137 136 130 127 129 131 131 129 127 126 128 130 130 127 126 132 133 129 128 132 134 130 131 131 131 135 137 131 127 131 136 148 162 161 146 141 144 142 142 140 136 135 135 135 134 134 131 134 137 138 138 138 139 139 139 140 147 140 143 137 142 141 147 143 144 144 136 129 128 131 131 133 135 135 134 134 137 140 134 134 134 132
222 146 151 153 152 154 159 160 158 156 162 168 166 157 150 148 150 145 142 138 136 133 127 125 129 131 131 129 126 126 128 128 127 125 129 134 132 132 134 130 127 130 132 131 131 133 132 129 131 130 133 144 155 152 140 138 145 143 140 137 135 134 134 132 130 129 132 137 139 139 140 140 141 141 144 147 143 142 142 145 147 149 149 149 148 142 130 124 129 129 132 135 137 138 138 139 140 138 136 133 131
223 151 149 149 151 152 151 152 153 159 157 157 162 167 165 155 145 147 146 139 136 137 130 124 130 128 134 136 132 126 124 126 127 125 126 131 129 131 134 131 130 129 133 131 128 132 136 136 136 154 150 143 141 145 146 142 140 138 136 135 134 135 136 134 133 133 136 140 142 141 141 142 142 141 146 143 145 138 144 141 143 140 144 145 148 147 135 127 133 131 134 139 142 144 145 144 142 139 135 130 129
224 152 151 150 150 150 151 152 152 151 155 160 161 161 161 164 167 146 149 145 136 131 132 131 126 128 126 126 128 130 130 127 124 125 126 127 128 130 133 133 131 128 129 130 133 135 132 131 137 144 143 151 151 146 139 133 137 137 135 136 136 132 131 134 133 133 138 140 139 138 134 133 139 141 142 143 144 142 140 139 141 139 146 146 140 139 138 132 127 129 137 145 145 144 145 147 149 141 127 124 130
225 151 149 147 146 146 147 149 149 151 153 155 156 157 159 161 164 162 151 144 143 140 132 128 129 132 129 127 127 128 129 128 127 126 128 129 130 131 132 130 127 131 131 130 132 134 130 129 134 130 134 146 147 143 138 132 136 133 132 134 135 130 130 132 130 133 136 136 136 138 136 136 142 144 143 143 143 141 139 138 139 142 143 141 141 142 136 128 127 137 145 148 143 141 143 144 140 141 132 128 128
226 148 147 146 146 148 150 151 151 152 151 150 151 153 156 159 160 164 162 155 147 142 140 135 130 125 125 126 127 129 129 128 127 131 132 131 131 132 132 130 127 132 132 129 129 131 128 127 132 131 138 149 146 140 137 132 133 131 131 134 135 131 131 132 130 131 134 133 133 135 135 139 147 147 144 142 142 141 138 137 138 144 141 138 140 139 130 127 135 139 146 146 139 138 144 143 136 141 137 132 126
227 148 149 149 150 151 151 150 149 150 150 150 151 153 155 156 157 157 165 166 156 148 146 143 137 126 126 126 126 126 126 127 128 133 133 131 129 130 131 131 129 129 130 128 127 128 126 128 134 144 148 153 145 139 140 136 135 133 132 135 136 132 132 134 132 129 132 133 132 133 133 137 147 147 144 140 140 139 138 136 136 143 141 139 137 132 125 131 147 142 144 142 138 140 145 145 140 141 139 135 130
228 153 152 150 149 148 146 145 143 147 149 151 153 153 153 154 155 154 157 163 166 160 150 146 148 140 136 130 125 122 124 127 130 130 130 129 129 130 131 130 128 126 129 129 127 127 127 132 140 146 147 150 143 142 147 142 139 134 133 135 135 131 131 133 132 131 131 130 131 136 136 135 138 143 139 137 137 137 136 135 135 140 141 138 134 132 131 138 150 148 144 141 142 144 143 142 142 143 140 141 141
229 155 152 149 147 146 146 147 147 144 146 149 151 150 150 151 153 153 155 158 162 163 161 154 149 141 138 134 131 129 128 127 127 127 129 131 133 134 135 132 128 127 131 130 128 128 130 134 143 142 144 148 146 148 151 143 137 132 131 132 132 128 128 131 130 135 132 128 132 142 142 134 130 137 135 135 136 136 135 134 135 137 138 134 132 136 140 140 143 145 140 139 143 143 138 137 140 143 141 144 148
230 154 153 151 149 149 149 149 149 145 145 145 145 147 149 151 152 151 157 157 153 157 166 163 154 141 139 137 136 136 134 131 128 129 131 132 133 134 135 133 129 131 132 129 126 128 130 132 137 139 140 147 147 148 148 138 133 131 130 132 132 128 129 131 129 134 134 134 139 145 142 134 132 135 135 137 139 139 137 137 138 134 136 134 133 137 138 138 140 138 137 139 141 140 136 134 136 138 138 142 144
231 156 155 155 154 152 148 145 142 148 144 141 141 145 149 152 153 155 153 152 154 156 158 163 168 154 147 139 135 134 136 136 136 130 130 128 127 129 131 131 129 134 133 127 123 127 128 128 130 135 135 143 143 143 142 133 130 131 130 134 135 131 131 133 131 129 137 144 146 144 138 135 140 136 137 141 143 143 140 140 141 131 136 136 135 132 130 133 143 139 143 145 143 139 135 133 131 131 134 138 137
232 156 156 155 153 153 152 150 146 147 146 146 147 147 147 146 145 150 152 153 153 154 156 159 161 170 158 142 133 134 137 136 132 132 134 135 132 129 127 129 131 136 135 134 132 132 133 134 135 135 135 136 139 141 139 136 135 134 131 129 134 140 136 130 132 132 135 142 144 141 143 146 143 147 138 138 142 140 136 135 135 132 129 129 131 131 130 134 140 143 139 136 137 137 135 132 132 133 134 134 133
233 153 157 160 158 153 151 150 149 146 148 149 149 147 145 143 142 144 146 148 150 151 154 156 158 163 165 161 150 139 134 136 139 137 136 135 136 135 133 129 126 129 132 135 139 142 143 144 143 144 141 139 137 134 131 131 133 130 137 140 138 132 126 130 142 131 130 134 139 137 137 140 141 140 134 136 141 140 139 138 137 133 130 129 130 129 127 130 135 141 140 141 142 140 136 134 134 129 130 132 133
234 157 155 154 153 155 156 152 147 144 147 149 148 145 144 144 145 144 145 146 149 152 154 155 155 156 161 166 163 156 148 141 136 137 135 135 136 138 137 134 131 128 128 129 130 133 135 138 140 146 146 148 148 145 141 140 141 131 137 139 137 134 130 130 136 137 131 134 140 139 136 140 144 143 139 139 138 135 135 134 130 132 130 129 131 130 129 131 135 135 138 141 142 138 133 132 134 132 133 133 133
235 159 156 151 151 155 158 155 150 148 149 148 146 144 144 145 147 147 147 146 148 151 153 153 153 154 155 157 161 165 163 153 143 140 139 137 136 135 136 138 139 137 135 132 130 130 131 133 135 135 136 139 142 143 141 141 142 137 136 131 129 135 136 132 129 134 129 130 135 133 132 135 137 140 138 138 135 133 138 141 137 131 129 129 130 130 129 130 132 132 135 138 137 133 130 131 133 137 137 135 134
236 155 159 161 159 155 156 158 160 156 155 153 150 148 147 145 144 144 143 142 143 145 148 150 150 155 156 156 155 157 160 163 164 154 149 143 139 139 140 141 141 138 139 139 139 137 135 133 132 134 129 125 126 128 130 132 134 137 137 131 126 128 131 133 136 130 129 132 132 129 130 132 129 139 139 139 137 135 140 142 137 131 129 128 128 127 125 125 125 136 137 135 133 131 131 132 133 133 134 135 136
237 154 158 162 161 160 159 158 157 157 157 156 156 156 154 150 147 141 140 139 140 143 146 149 150 151 154 155 153 153 156 160 162 162 154 147 146 149 151 148 143 140 140 139 138 136 134 132 131 137 131 126 127 129 130 130 130 133 135 132 131 133 133 131 134 131 134 138 137 133 134 135 131 137 137 139 138 134 135 134 128 131 129 128 128 128 129 129 129 139 138 135 131 130 132 133 132 128 132 135 138
238 160 158 157 157 161 162 158 153 154 155 156 157 157 157 156 156 146 146 145 144 144 146 148 149 148 150 152 153 155 156 154 151 159 156 152 151 151 152 151 150 150 148 145 142 140 138 138 138 132 130 130 132 134 133 131 130 132 130 129 134 139 135 129 128 128 130 136 137 132 129 131 130 130 130 134 136 135 136 137 134 130 130 129 130 133 135 136 136 139 139 136 132 131 131 131 130 129 132 135 136
239 163 163 161 158 157 158 159 159 155 156 156 154 153 154 157 161 153 153 152 149 146 144 144 145 149 152 153 151 150 152 155 157 156 159 159 152 145 142 147 153 147 148 150 150 149 146 142 140 137 135 133 134 135 135 136 138 135 131 127 129 132 128 128 134 128 127 134 139 133 126 129 133 140 137 138 138 135 135 137 137 132 131 130 131 133 136 137 137 139 140 139 135 133 132 131 129 129 130 131 132
240 158 159 162 165 165 163 158 155 166 156 150 153 155 153 153 157 156 153 150 149 150 150 148 146 144 148 151 151 150 150 153 157 162 154 153 158 156 146 141 143 148 147 148 150 150 147 145 146 140 134 131 133 136 136 135 135 141 133 128 129 130 129 128 129 124 132 136 140 132 123 132 140 142 135 140 142 145 131 134 139 133 132 130 129 130 132 133 133 141 140 139 137 135 133 131 130 126 130 131 129
241 156 157 159 161 163 163 161 160 158 162 161 154 151 155 157 156 152 155 157 154 149 147 148 150 147 146 146 148 152 155 156 156 152 160 162 157 157 159 152 141 135 143 146 142 144 149 146 136 140 134 130 130 131 131 132 133 136 130 127 130 133 131 130 130 130 129 126 133 135 132 137 139 127 135 142 137 135 132 134 132 130 130 129 130 132 133 132 132 136 135 134 133 131 130 129 128 131 131 129 128
242 155 155 155 157 160 162 164 164 160 160 161 161 157 152 154 158 155 155 154 154 154 152 150 148 148 146 145 147 151 155 155 153 155 156 156 155 156 157 155 151 135 133 131 131 133 137 140 141 145 140 135 132 131 131 133 135 135 131 130 133 135 132 128 127 130 130 127 130 130 128 137 140 137 135 133 137 135 134 129 127 131 130 129 129 130 130 130 130 135 135 133 132 130 130 129 129 128 129 128 127
243 155 154 153 154 157 160 162 164 164 157 157 162 162 155 153 156 156 153 152 153 156 156 153 150 149 149 149 148 147 147 149 151 157 153 151 154 156 155 157 161 161 152 143 138 134 131 135 142 145 143 140 136 134 132 133 134 134 132 131 134 135 132 128 127 130 133 130 129 126 123 132 135 147 139 130 136 133 135 127 128 131 129 127 126 127 128 130 131 135 135 134 133 132 131 130 130 125 130 131 129
244 155 154 153 154 155 157 159 159 159 163 162 158 158 163 160 153 151 153 155 154 152 151 155 158 153 152 151 149 147 146 147 148 148 152 153 153 156 161 161 159 159 164 161 149 142 143 142 136 140 141 140 138 135 132 131 131 130 128 128 130 132 131 130 129 132 133 128 128 129 128 132 128 134 143 139 133 123 132 132 131 129 128 128 127 127 128 130 131 130 130 130 130 130 129 128 128 129 133 134 130
245 154 153 153 153 154 155 155 155 158 162 164 162 160 161 161 160 154 154 153 152 152 153 155 157 157 154 150 150 151 152 150 148 146 143 143 146 149 150 154 159 152 157 160 157 152 149 146 142 141 143 144 143 141 139 136 134 133 130 128 127 127 127 127 126 126 132 131 131 131 131 137 136 135 139 137 136 130 130 130 131 133 133 133 131 129 127 126 125 127 128 128 128 128 128 128 128 131 131 130 130
246 152 152 152 153 154 154 154 154 159 156 158 164 165 160 159 162 161 156 151 151 154 156 155 152 156 154 152 152 153 154 152 151 152 143 138 141 142 140 146 157 163 159 159 163 160 152 147 149 148 149 149 147 146 145 143 141 140 137 132 128 126 126 125 124 121 132 133 132 129 131 142 144 143 132 131 136 139 129 129 134 138 137 136 133 129 128 127 128 134 133 131 129 128 128 128 128 128 128 129 132
247 150 150 150 152 153 155 155 155 154 156 156 156 162 168 163 152 159 159 158 155 151 150 152 154 152 155 157 155 151 149 152 155 152 156 153 144 142 149 151 147 145 151 154 156 160 164 159 150 149 149 147 145 144 145 144 142 142 139 135 131 129 129 128 128 127 131 127 127 131 137 145 141 133 131 135 129 133 128 136 139 136 135 132 130 129 131 136 140 141 138 134 131 128 127 127 128 127 130 134 135
248 150 151 150 149 150 152 154 153 154 152 152 154 157 160 164 168 159 159 163 164 157 148 147 151 152 154 155 157 157 156 154 153 155 153 153 155 154 149 146 144 147 154 156 154 155 162 166 165 158 152 147 147 149 148 146 145 146 145 141 136 135 135 132 128 130 128 126 126 129 132 132 129 132 133 132 134 136 133 134 140 138 130 128 137 144 142 137 136 133 131 130 129 128 126 127 129 129 130 130 129
249 149 150 150 149 149 151 153 152 154 152 152 153 154 155 158 161 162 161 162 164 166 164 157 150 153 153 153 153 153 153 153 152 155 154 154 154 152 149 151 154 152 144 142 148 151 151 157 165 165 161 157 153 151 150 147 145 146 145 143 141 140 139 136 131 133 132 129 127 129 132 133 132 134 133 131 131 132 130 130 137 138 134 131 133 137 141 144 146 146 137 131 133 135 132 129 129 129 128 128 128
250 147 148 149 148 148 151 151 151 155 154 153 155 155 154 155 156 156 160 160 157 159 164 166 163 155 155 153 152 151 151 151 151 147 152 158 160 157 154 154 156 146 137 135 140 139 135 143 158 161 163 163 159 157 156 154 151 149 150 149 148 147 144 139 135 137 136 134 130 130 132 133 133 133 132 128 128 129 127 128 135 135 135 132 126 126 135 145 150 143 135 129 131 134 131 129 129 129 127 125 126
251 144 146 147 146 148 150 150 150 153 152 153 155 155 154 154 156 153 157 157 153 152 158 164 166 157 158 158 156 152 150 151 152 151 152 153 154 154 155 158 161 154 149 143 141 146 151 150 145 150 158 162 160 159 160 159 155 153 153 154 154 153 150 146 142 139 140 139 136 133 133 133 133 131 130 126 127 129 127 128 135 133 134 132 126 125 131 140 146 138 138 135 133 130 129 129 129 130 128 126 125
252 143 145 145 145 146 149 149 149 149 148 150 152 154 153 153 154 157 156 156 157 159 159 157 156 155 159 162 160 156 153 153 154 149 149 151 154 158 159 156 152 148 158 162 156 152 155 153 148 147 154 157 154 153 156 157 155 153 154 155 157 157 155 153 152 140 143 144 142 138 136 134 132 131 130 127 128 131 129 129 134 133 132 133 135 136 137 141 145 144 148 145 137 133 135 133 128 128 129 129 128
253 143 145 145 144 145 147 148 147 149 148 149 151 152 152 152 154 155 155 156 157 157 155 157 160 153 156 160 160 159 157 156 157 150 150 150 153 156 157 153 147 142 152 161 160 153 148 149 151 148 150 150 147 148 153 156 156 157 156 156 157 156 154 153 153 143 146 148 146 143 140 136 133 133 132 129 131 133 130 127 132 130 128 131 139 145 145 143 143 140 141 137 131 133 139 134 125 126 129 132 132
254 145 146 145 144 144 145 146 146 150 148 148 150 151 151 152 154 150 155 156 152 149 153 160 165 156 155 155 157 160 160 159 157 159 156 150 143 142 148 154 158 160 152 148 153 160 161 156 150 151 149 147 148 151 154 156 156 157 156 156 156 154 151 150 151 148 150 150 148 145 143 140 138 135 133 130 131 133 129 126 130 128 127 129 135 143 146 142 136 132 129 125 125 130 134 133 129 130 131 131 131
255 147 147 146 143 143 144 145 144 147 146 145 147 148 148 150 153 153 156 154 150 153 161 159 151 162 157 153 154 160 163 160 156 147 154 159 156 150 148 148 149 158 160 159 153 150 154 160 163 155 151 150 154 157 155 152 150 151 151 152 154 154 152 151 153 152 152 151 148 146 145 144 142 135 133 129 130 132 129 126 130 129 131 130 130 137 143 139 129 133 129 127 131 131 130 133 140 137 133 128 126
256 146 147 148 147 146 146 148 151 143 146 147 147 147 148 149 148 149 151 149 146 146 149 151 149 157 157 158 156 149 145 156 171 161 151 150 157 161 160 155 148 154 150 151 154 153 150 155 163 163 158 156 159 158 153 150 151 151 152 151 150 152 156 156 154 152 152 152 151 150 148 147 146 138 139 137 132 128 127 127 126 130 130 132 136 138 138 141 144 142 138 133 130 129 129 129 129 140 127 127 128
257 144 145 146 146 145 145 146 148 149 148 146 142 141 143 146 146 146 147 146 145 146 148 150 150 148 153 157 156 151 150 153 156 166 163 159 150 145 152 159 159 143 142 145 152 158 159 154 150 157 161 163 160 160 163 162 158 150 152 153 152 153 153 151 147 154 153 152 150 149 148 148 148 145 143 138 133 130 130 129 128 131 129 129 131 134 136 141 146 144 141 137 133 131 130 129 128 131 124 129 131
258 143 144 146 146 145 145 146 147 149 148 144 139 138 140 142 143 146 144 144 146 147 147 149 151 146 154 157 153 153 158 156 150 158 160 162 158 150 151 155 156 169 157 142 135 143 155 159 156 156 161 162 158 157 160 162 161 162 160 155 149 146 148 151 152 153 153 152 152 151 151 150 150 147 144 138 132 131 132 131 129 130 128 128 129 131 133 138 142 139 137 134 132 130 128 126 124 128 123 132 136
259 143 145 146 146 145 145 145 144 145 146 145 143 142 143 144 143 147 145 145 148 149 147 149 152 151 155 153 148 151 159 161 156 151 146 153 166 165 156 150 149 149 161 170 165 154 148 148 151 154 153 155 160 159 154 153 156 157 159 161 160 158 155 154 153 150 151 153 154 154 153 151 150 144 143 139 135 133 133 132 130 128 128 129 130 130 130 131 133 130 129 128 127 126 125 124 123 128 124 131 139
260 143 146 146 145 144 145 144 142 145 147 149 148 147 148 148 147 149 146 147 149 150 147 147 150 153 153 150 147 149 154 158 158 156 145 145 155 158 157 157 157 159 153 149 155 163 163 157 151 149 148 152 160 162 158 154 154 153 155 159 161 161 160 160 161 152 153 153 154 153 153 152 151 145 147 146 142 138 135 133 131 128 129 130 130 129 128 128 127 127 127 126 125 125 125 126 126 127 123 128 134
261 147 149 148 145 145 147 147 145 146 148 148 146 146 147 148 148 147 147 147 148 148 147 147 147 149 150 152 153 153 152 153 155 159 155 150 144 144 155 163 162 155 154 156 158 156 153 156 161 154 156 153 150 152 158 160 156 161 158 154 153 153 155 160 164 158 157 155 153 151 151 152 153 151 154 155 151 145 141 137 134 134 134 133 130 128 129 130 130 128 128 127 125 124 124 126 127 127 128 129 127
262 147 149 148 144 144 148 149 147 145 146 146 145 144 145 146 145 144 146 147 147 147 148 148 147 146 149 152 155 155 153 153 154 154 159 160 153 148 154 158 152 162 162 159 155 154 155 157 158 161 161 156 148 148 154 157 156 156 155 156 159 159 156 154 154 160 159 157 155 154 153 153 153 153 155 155 152 149 147 144 142 141 141 138 133 130 131 132 132 130 130 129 127 125 124 125 126 128 131 130 124
263 144 145 143 140 141 146 147 145 143 146 148 148 147 147 147 145 142 146 147 146 147 150 150 147 144 148 150 150 151 154 156 156 150 154 162 165 160 154 149 141 148 160 166 162 157 158 159 156 155 155 158 163 160 153 151 153 156 154 153 156 159 159 160 161 157 158 159 159 159 157 154 152 150 150 149 149 150 152 151 149 147 147 144 138 134 134 133 132 132 133 132 131 128 127 127 127 125 128 128 125
264 149 142 139 143 147 147 146 146 146 147 147 146 145 145 147 148 148 146 146 146 146 146 148 151 149 148 148 149 149 149 151 155 155 155 156 159 163 161 152 142 149 150 159 167 163 156 156 158 157 160 159 156 158 162 160 153 155 155 156 156 156 156 156 155 162 160 158 157 158 159 159 158 152 151 151 152 153 154 153 152 150 150 148 144 140 138 137 138 135 135 135 134 131 129 127 127 128 129 130 131
265 145 145 146 146 144 142 144 146 143 144 146 147 146 145 145 145 149 147 146 146 145 144 145 148 148 148 149 151 151 150 151 154 153 153 155 158 163 165 161 155 152 143 144 154 163 165 162 156 156 157 158 158 158 159 159 158 155 155 154 154 154 155 155 155 158 158 158 157 157 157 158 158 162 160 157 154 152 153 155 157 151 152 152 150 146 143 141 141 138 137 137 137 137 134 130 127 129 132 133 131
266 141 144 144 140 137 137 140 142 144 145 146 147 146 146 146 147 148 146 146 145 144 143 144 146 147 147 149 152 152 150 150 152 150 151 151 153 158 163 164 162 160 152 147 146 150 158 165 165 160 157 155 157 158 157 158 162 158 157 156 155 155 154 154 154 156 157 159 158 157 156 157 159 159 157 154 150 146 146 149 152 151 153 154 153 151 148 146 145 145 142 139 139 141 140 135 131 131 130 133 142
267 151 151 147 142 142 146 147 145 146 146 144 143 144 145 147 149 145 144 144 145 145 144 145 148 146 147 149 150 151 150 150 150 150 151 150 149 152 156 159 160 166 166 163 153 144 148 159 163 166 160 155 155 157 158 159 160 161 160 159 158 156 154 152 151 154 156 157 158 158 157 158 159 155 156 156 154 152 150 150 150 150 151 152 152 152 150 149 149 151 147 142 140 141 141 139 137 131 132 132 134
268 146 147 144 139 139 142 141 138 144 143 142 141 142 143 145 145 144 143 143 145 145 145 146 148 146 147 147 147 148 149 149 148 151 152 151 150 150 154 157 158 163 165 168 164 157 155 153 147 161 162 161 157 156 157 158 158 160 160 160 159 157 155 152 150 152 152 153 155 158 159 159 159 155 155 157 158 159 157 154 151 151 150 149 149 150 151 152 152 152 150 146 144 142 142 141 141 140 137 133 128
269 145 149 152 150 146 143 142 141 141 142 143 145 146 145 143 141 144 143 143 145 145 144 145 147 146 147 146 145 146 148 148 147 147 149 149 149 150 153 156 156 156 159 166 168 165 164 160 152 151 160 165 162 157 156 156 157 159 160 161 161 161 159 157 156 151 150 150 152 156 158 159 158 155 155 154 156 157 157 154 152 154 152 150 149 150 152 153 154 149 150 151 150 147 144 143 142 146 143 140 139
270 140 143 146 148 146 141 139 139 143 144 146 148 149 147 143 140 143 142 143 144 144 143 144 146 146 147 146 145 146 148 148 146 145 146 147 147 148 152 154 154 154 156 162 165 162 164 167 166 154 155 157 159 160 157 155 154 159 159 160 160 161 161 161 161 156 155 153 153 153 155 156 157 159 158 158 157 158 158 157 157 157 155 153 152 153 153 153 152 149 151 153 153 151 148 147 146 145 148 149 143
271 147 142 141 146 150 149 145 144 144 144 145 146 147 146 143 140 141 141 142 143 143 143 143 145 146 147 146 145 146 149 148 145 146 147 147 147 148 151 152 151 154 151 155 161 162 164 165 162 166 152 144 152 162 161 155 151 157 157 156 156 156 157 158 159 162 161 159 155 152 151 153 155 154 156 157 156 155 155 156 157 158 157 156 155 155 153 151 149 151 152 152 153 152 151 151 151 151 149 148 148
272 148 147 145 144 145 146 148 149 146 144 142 142 143 145 146 146 143 144 145 145 148 149 147 143 146 145 146 146 143 141 143 147 148 147 147 148 149 150 150 150 152 152 154 158 160 160 161 162 168 167 157 150 155 157 155 158 150 154 157 157 157 157 157 155 159 159 161 162 161 158 155 152 153 154 155 155 154 154 155 155 154 155 155 154 153 153 155 156 153 152 151 151 151 151 151 151 151 150 148 147
273 147 147 146 145 145 146 147 148 144 143 143 144 145 146 145 145 143 144 144 144 145 146 144 141 144 142 141 142 142 141 141 143 144 144 145 147 149 151 152 152 152 151 152 156 159 159 159 159 157 166 170 164 157 152 153 158 151 153 155 156 156 155 156 157 156 156 157 158 159 158 157 156 156 156 156 155 154 154 156 157 155 155 156 156 155 154 155 156 154 153 151 150 149 148 147 145 151 150 149 149
274 145 146 146 146 146 145 145 145 146 145 144 144 143 142 141 140 143 144 143 142 143 144 143 140 146 143 141 143 145 145 144 143 144 144 145 147 147 148 148 148 151 150 151 155 157 158 157 158 160 164 169 169 164 160 157 152 153 151 152 154 155 153 155 158 155 155 154 155 157 158 159 160 157 157 157 156 155 155 155 156 154 154 155 155 154 154 154 154 154 152 151 151 153 153 151 150 150 150 149 149
275 143 144 145 145 145 144 143 143 148 147 145 143 142 142 142 142 143 144 143 142 142 144 143 141 147 145 144 146 148 148 147 146 145 146 147 148 147 147 146 146 150 150 151 154 156 156 157 159 164 157 159 163 166 171 168 157 160 153 150 154 155 153 154 157 157 156 155 156 157 159 160 160 156 158 159 159 158 156 154 154 154 154 154 154 154 154 155 155 152 151 150 152 155 156 154 152 151 151 151 150
276 143 144 145 146 146 145 144 143 145 145 146 146 145 145 145 146 143 144 144 142 143 145 145 144 143 144 144 144 144 144 145 145 142 144 146 148 149 149 150 151 147 148 151 153 153 153 155 159 157 154 158 160 159 166 174 172 167 159 153 156 159 156 155 157 158 157 156 157 158 158 159 159 159 159 160 160 159 157 157 156 157 156 155 155 155 156 157 157 154 152 151 152 153 152 150 148 151 151 152 153
277 144 145 146 147 147 146 146 145 143 145 147 148 146 144 141 140 142 144 144 143 144 146 147 146 140 143 144 143 140 141 142 144 140 142 144 146 146 146 147 149 145 146 149 151 150 150 152 156 156 158 160 159 156 159 166 168 170 164 160 161 162 160 158 158 157 156 156 157 158 158 158 157 162 162 161 159 159 159 160 162 158 156 155 155 155 155 155 155 157 156 155 155 155 154 153 152 153 152 151 151
278 144 145 145 145 146 146 146 146 146 147 148 147 144 141 139 138 141 143 144 143 143 145 146 145 141 145 146 143 140 141 143 144 143 144 145 144 141 140 141 142 147 146 146 149 150 150 150 152 157 159 157 155 157 158 158 158 165 165 164 163 161 159 159 160 158 158 158 158 158 158 157 156 160 160 160 160 160 160 161 162 159 158 157 157 157 156 153 152 155 156 157 157 156 157 158 159 156 154 152 151
279 143 143 143 143 144 145 146 146 149 149 148 146 144 144 146 148 140 142 143 143 143 144 145 144 143 146 146 143 141 143 144 144 146 146 147 145 142 140 141 142 151 147 145 148 151 151 150 149 148 155 154 152 157 158 157 163 158 163 166 163 159 157 159 160 162 161 160 159 159 158 157 156 154 157 160 162 162 160 159 158 164 163 163 162 162 159 155 152 152 153 154 153 151 151 153 155 159 158 157 156
280 148 145 140 138 140 143 143 141 142 143 144 146 147 147 147 146 143 141 142 145 146 145 146 147 143 145 146 145 145 146 144 142 140 142 145 146 146 146 146 146 146 147 148 148 147 148 150 152 152 150 152 156 156 154 155 158 162 158 162 166 164 165 160 146 152 159 162 159 160 164 161 153 151 157 159 159 160 157 155 157 161 159 157 158 160 161 160 159 156 154 152 152 153 155 154 152 154 154 153 154
281 144 144 142 139 138 141 143 144 141 143 144 145 146 146 147 148 147 145 145 146 147 145 146 147 143 144 145 144 144 146 145 144 140 141 142 142 144 145 147 148 144 146 149 149 148 147 147 148 145 146 148 150 152 152 154 156 159 158 162 163 160 165 171 168 145 147 151 155 158 158 158 158 160 158 153 152 158 161 161 162 158 158 158 159 161 161 161 161 161 159 156 154 153 153 154 154 155 153 152 152
282 143 146 146 142 138 139 143 145 143 144 145 146 145 146 147 148 148 147 146 146 145 144 143 144 143 144 144 143 143 145 147 146 146 145 143 143 143 143 143 143 142 144 147 149 148 147 146 146 144 146 148 148 150 153 155 155 153 155 161 163 160 163 167 166 175 158 148 152 154 150 152 160 162 164 161 158 157 156 157 162 159 160 160 160 159 158 158 158 162 162 161 157 153 151 150 150 155 153 152 152
283 148 150 150 146 142 141 142 142 143 145 147 147 145 145 145 147 146 146 147 146 145 144 143 143 144 144 143 142 142 145 147 147 149 148 147 147 146 144 141 139 141 143 145 147 147 147 147 148 147 151 151 149 149 153 154 153 151 153 157 161 162 161 158 154 167 171 159 137 132 147 154 148 154 159 162 163 162 158 156 160 159 160 161 159 157 156 156 157 158 159 160 160 158 155 152 151 152 152 153 153
284 149 149 148 146 147 147 143 139 141 143 145 145 145 144 144 144 144 146 148 149 148 147 146 145 145 146 144 142 142 145 146 147 146 147 147 148 149 148 147 146 144 144 144 144 145 146 148 149 148 151 151 148 147 150 151 150 154 154 154 155 159 160 160 161 155 162 165 155 142 138 143 149 150 148 145 152 163 166 163 164 159 160 161 160 158 157 159 162 156 156 157 159 162 162 161 159 153 154 154 154
285 147 146 144 145 148 149 146 141 139 139 141 142 143 144 143 143 140 144 147 148 147 147 146 145 146 147 145 143 143 145 146 146 146 147 146 146 146 148 150 152 148 146 145 143 143 145 147 148 147 148 149 148 148 149 150 150 150 155 156 156 157 156 158 166 164 156 161 173 168 151 148 161 159 152 144 143 151 155 159 166 163 164 164 163 160 159 160 161 163 160 157 157 159 160 160 158 158 159 158 156
286 147 147 146 145 145 147 146 144 142 141 140 141 143 144 144 143 140 143 146 145 144 145 146 145 146 147 146 144 144 146 146 145 145 146 147 145 143 144 147 150 147 146 145 144 144 145 145 145 145 146 147 149 149 149 150 152 147 154 155 157 160 155 153 159 150 156 158 155 161 171 170 160 165 163 157 152 148 144 148 159 164 165 166 165 163 161 160 160 166 163 160 158 157 156 154 153 160 159 158 158
287 150 152 152 147 142 142 144 146 149 145 142 141 143 145 145 143 142 146 147 145 144 145 147 147 146 147 147 145 145 147 147 145 140 143 146 146 143 143 145 148 144 144 145 145 146 145 144 144 144 142 144 148 149 147 147 151 150 152 149 152 160 158 153 157 152 153 159 162 158 152 155 163 161 162 161 162 161 152 147 150 157 159 162 164 165 164 163 163 161 162 164 163 161 158 156 155 156 154 154 157
288 144 147 151 151 147 143 145 150 144 148 148 144 142 144 144 142 144 144 144 143 143 145 145 144 146 148 147 144 143 147 148 147 144 147 147 145 146 148 147 144 145 144 143 140 137 140 144 141 142 144 146 146 146 146 147 149 148 149 149 149 150 154 156 156 158 152 148 151 155 156 155 155 163 159 155 157 163 165 159 151 149 158 161 161 164 165 164 164 161 164 162 158 159 164 165 161 159 157 156 157
289 148 141 136 140 147 150 148 146 146 150 151 145 140 141 144 144 143 145 144 142 141 143 144 143 141 143 145 144 144 145 145 144 146 146 144 142 143 145 146 145 144 144 146 145 141 142 143 140 143 144 145 145 145 146 148 150 148 149 148 147 148 151 152 152 155 160 156 143 138 147 156 156 154 157 159 158 157 160 163 165 169 159 149 153 162 162 160 163 165 163 165 169 166 158 159 166 165 162 159 158
290 173 165 155 148 145 145 146 148 140 144 147 148 149 150 146 140 146 147 147 144 143 143 144 144 143 143 144 145 145 143 142 143 145 144 145 148 148 147 147 147 145 145 147 147 144 144 145 141 142 142 142 142 143 144 145 146 148 149 148 147 147 149 150 149 150 155 157 152 144 141 145 150 152 155 156 155 155 157 160 161 154 163 163 158 159 160 158 156 161 164 165 164 162 162 163 164 165 162 159 159
291 174 174 171 161 149 142 143 147 151 150 148 145 145 146 146 143 146 148 149 146 144 143 144 143 147 144 143 145 146 145 145 148 143 142 143 146 146 142 142 144 146 145 147 147 144 145 148 146 142 141 141 142 142 142 142 141 148 149 150 149 149 150 149 148 146 147 152 159 158 149 141 139 148 150 152 153 154 156 155 154 160 151 150 164 171 159 152 159 159 158 154 151 156 165 166 162 164 160 158 160
292 168 170 173 173 169 160 148 140 142 146 149 149 147 147 148 150 144 146 147 145 143 142 142 140 145 142 142 145 147 146 147 149 150 146 144 145 143 141 143 148 146 144 147 148 145 145 147 145 141 142 143 144 144 144 143 143 145 148 150 150 150 150 149 147 145 150 151 149 154 159 153 141 139 146 151 151 149 151 155 157 158 161 155 147 151 161 164 163 165 153 147 153 158 157 158 163 167 164 161 162
293 168 170 173 176 178 176 169 161 147 144 142 144 149 152 150 146 145 146 146 144 144 144 143 141 146 144 144 146 146 144 140 139 142 143 146 148 148 147 147 149 145 144 148 151 147 145 144 142 139 141 144 144 144 143 144 144 143 145 147 148 149 150 149 147 147 148 148 148 151 156 156 153 144 144 143 142 144 149 151 152 154 154 155 157 154 147 153 169 163 159 158 159 158 154 154 158 166 163 162 164
294 156 160 162 163 167 174 180 183 181 167 151 143 144 146 146 143 148 147 145 143 144 147 147 145 148 148 147 146 145 144 140 135 132 137 141 143 143 143 144 143 145 143 147 151 148 145 145 143 139 142 144 143 141 140 142 145 143 145 145 145 146 148 149 148 148 145 146 152 153 150 152 157 154 148 141 139 144 149 147 142 143 151 152 149 156 163 156 146 157 162 163 160 158 158 157 154 160 159 159 161
295 158 159 159 158 160 165 169 170 173 177 179 173 161 150 147 148 149 147 142 140 142 147 148 146 146 147 146 144 146 149 148 144 148 149 145 138 136 140 145 146 145 142 145 148 146 145 148 148 143 146 147 144 140 138 142 145 145 145 145 144 145 148 150 149 147 150 149 145 146 152 154 150 154 154 152 148 147 147 148 147 142 147 146 143 148 153 156 159 158 151 152 161 164 159 157 161 157 156 157 158
296 154 156 156 156 155 156 158 161 164 166 169 174 179 179 171 162 147 148 150 149 144 140 143 148 146 145 145 147 147 146 143 141 147 146 145 145 143 140 134 129 140 143 146 146 144 144 147 150 143 144 143 141 139 139 137 135 140 145 147 142 139 142 147 149 144 147 150 150 149 148 149 151 149 153 154 152 149 148 147 146 144 144 146 148 148 146 147 150 169 159 149 148 154 161 161 159 161 159 160 163
297 155 157 158 157 156 157 159 161 164 164 163 164 169 175 178 178 164 152 142 142 148 151 147 143 146 148 146 141 141 145 147 146 146 145 145 146 147 146 145 143 135 138 140 141 142 145 149 153 146 145 142 138 137 139 141 141 144 141 140 141 144 145 145 144 144 145 147 147 147 146 146 147 150 150 149 149 152 154 152 147 146 145 145 147 146 145 147 150 146 152 156 155 151 150 154 158 157 162 163 160
298 161 162 162 162 161 161 163 164 162 163 163 161 160 163 166 167 180 177 171 160 148 141 144 150 142 143 143 142 140 140 143 146 148 148 147 147 147 147 147 148 141 141 141 141 141 143 146 148 147 146 142 138 137 139 142 142 147 140 138 143 147 145 142 141 145 145 146 146 146 146 146 146 148 148 147 148 152 155 154 151 148 147 147 147 147 147 150 154 145 149 155 157 156 155 155 156 154 158 159 156
299 157 158 158 158 157 156 157 158 157 161 163 163 162 164 165 165 157 162 168 171 167 158 150 145 137 139 145 149 142 131 133 142 145 146 146 145 144 144 144 144 149 147 145 144 143 143 144 144 147 148 147 144 143 143 142 140 143 143 144 146 144 141 140 141 144 144 144 145 146 147 147 147 145 148 150 149 147 148 151 154 151 151 150 149 148 148 150 152 156 152 150 153 159 163 161 158 155 151 150 155

- 결국 이 이미지는 683 $\times$ 1024 개의 숫자의 모임

- 이 이미지를 벡터로 만든다음 히스토그램을 그려보자.

img.flatten().shape
(699392,)
fig1=plt.hist(img.flatten(),256,[0,256])

- 히스토그램을 그려보니 120~200 사이에 너무 값들이 모여있음

- 원래 0~255까지의 색을 표현할 수 있는데 컴퓨터가 표현가능한 색상보다 적은 조합만을 사용하고 있음.

- 아이디어: 좀 더 많은 색상을 표현할 수 없을까? $\to$ 위의 히스토그램은 좀 평평하게 만들면 되지 않을까?

img2=cv.equalizeHist(img)
fig2_1=plt.hist(img2.flatten(),256,[0,256])
# 256개의 구간으로 히스토그램 만들어
fig2_2=plt.hist(img2.flatten(),10,[0,256])
plt.imshow(img2,cmap='gray',vmin=0,vmax=255)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f6a6e40d1f0>

- 변환전과 변환후를 나란히 보게 되면?

import numpy as np
_img=np.hstack((img,img2))
plt.imshow(_img,cmap='gray')
<matplotlib.image.AxesImage at 0x7f6a6967c760>

- 아래 이미지를 HE(histogram equalization)로 보정하고 스샷제출

hw_img=cv.imread('hw_img.png',0)
plt.imshow(hw_img,cmap='gray')
<matplotlib.image.AxesImage at 0x7f6a69661df0>
hw_img2=cv.equalizeHist(hw_img)
plt.imshow(hw_img2,cmap='gray',vmin=0,vmax=255)
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f6a69572b20>
_img_hw=np.hstack((hw_img,hw_img2))
plt.imshow(_img_hw,cmap='gray')
plt.colorbar()
<matplotlib.colorbar.Colorbar at 0x7f6a694ad280>