注解

此笔记本可在此处下载: Image_Processing_Tutorial_3.ipynb

哈勃极深场

哈勃极端深场(HXDF)是位于天穹星座(法语为Fourneau)的一个区域,覆盖了天空的1.3亿分之一,包含了大约10000个天体。

这张照片是由2000张图片拍摄的,是10年工作的结果。

Futher informations

HXDF in 3D

安装程序

%matplotlib nbagg
from skimage import data
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from skimage.morphology import convex_hull_image
from skimage import measure

打开图像

image = data.hubble_deep_field()[0:500, 0:500]
channels = ['red', 'green', 'blue']

fig = plt.figure("HDF")
plt.imshow(image)
plt.axis("OFF")
plt.show()
<IPython.core.display.Javascript object>

信道识别

图像每像素有5个信息,X和Y位置以及3个RGB通道中的像素值。 : \(pixel(x,y)=[R,G,B]\)

fig = plt.figure("Channels")
for i in range(0,3):
    fig.add_subplot(1, 3, i+1)
    plt.imshow(image[:,:,i], origin = "upper", cmap = cm.gray)
    plt.title("{0}".format(channels[i]))
    plt.axis("OFF")
plt.show()
<IPython.core.display.Javascript object>

绘制柱状图

bins=np.arange(256)
fig = plt.figure("Histograms")
for i in range(0,3):
    fig.add_subplot(1, 3, i+1)
    plt.hist(image[:,:,i].flatten(), bins, histtype = "stepfilled",
             color="{0}".format(channels[i]))
    plt.ylim([0,18000])

    plt.title("{0}".format(channels[i]))
    plt.grid()
    plt.xlabel("Pixel value")
    plt.ylabel("Pixel count")
plt.show()
<IPython.core.display.Javascript object>

对通道进行阈值设定

fig = plt.figure("Thresholding")

for i in range(0,3):
    fig.add_subplot(1, 4, i+1)
    plt.imshow(np.where(image[:,:,i]<100,np.nan,image[:,:,i]), origin = "upper")
    plt.title("{0}".format(channels[i]))
    plt.ylim([380,420])
    plt.xlim([100,150])
    plt.axis("OFF")

fig.add_subplot(1, 4, 4)
plt.title("R+G+B")

plt.imshow(image[:,:,:], origin = "upper")
plt.ylim([380,420])
plt.xlim([100,150])
plt.axis("OFF")

plt.show()
<IPython.core.display.Javascript object>
fig = plt.figure("Star")

for i in range(0,3):
    fig.add_subplot(1, 4, i+1)
    plt.imshow(np.where(image[:,:,i]<100,0,image[:,:,i]), origin = "upper")
    plt.title("{0}".format(channels[i]))
    plt.ylim([140,190])
    plt.xlim([230,280])
    plt.axis("OFF")

fig.add_subplot(1, 4, 4)
plt.title("R+G+B")

plt.imshow(image[:,:,:], origin = "upper")
plt.ylim([140,190])
plt.xlim([230,280])
plt.axis("OFF")

plt.show()
<IPython.core.display.Javascript object>

3D绘图娱乐

image3D = data.hubble_deep_field()[380:420,100:150][:,:,1]

fig = plt.figure("3D plot of a galaxy")
ax = fig.add_subplot(111, projection='3d')

x, y = np.meshgrid(np.arange(image3D.shape[1]),
                   np.arange(image3D.shape[0]))

ax.plot_trisurf(x.flatten(), y.flatten(), image3D.flatten(), cmap=plt.cm.jet,antialiased=True)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('pixel value')
plt.show()
<IPython.core.display.Javascript object>

凸包

fig = plt.figure("Convex Hull")
plt.imshow(image, interpolation='nearest', cmap=plt.cm.gray)

r= convex_hull_image(np.where(image[:,:,0]==255,1,np.nan))
g= convex_hull_image(np.where(image[:,:,1]==255,1,np.nan))
b= convex_hull_image(np.where(image[:,:,2]==255,1,np.nan))

rc=measure.find_contours(r, 0.8)
gc=measure.find_contours(b, 0.8)
bc=measure.find_contours(g, 0.8)

for n, contour in enumerate(rc):
    plt.plot(contour[:, 1], contour[:, 0], c='r', linewidth=2)
for n, contour in enumerate(gc):
    plt.plot(contour[:, 1], contour[:, 0], c='g', linewidth=2)
for n, contour in enumerate(bc):
    plt.plot(contour[:, 1], contour[:, 0], c='b', linewidth=2)
ax.axis('image')
ax.set_xticks([])
ax.set_yticks([])
plt.show()
<IPython.core.display.Javascript object>