Space Transform

eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXFtz2shcdTAwMTJ+96+gvI9nrZ37ZavOg++XeG3HjmM7Z7dSslx1MDAxMCAjJFZcdTAwMTK2YSv//fTIXHUwMDE4XUCAY8iBysFVXHUwMDAxNCNNz3R//XX3XGb5Z6NW20z6XXfz99qm++zYvleP7KfNX831RzeKvTCAJpJ+j8Ne5KQ9W0nSjX//7Te727WaXnJcdTAwMWaGbctcdDsvt7m+23GDJIaO/4Hvtdo/6b+5gVwi10nsoOm76VxyaVM2XHUwMDE2lrR89SxcZtJxXHRGnDOthVx1MDAxY/Xw4j1cdTAwMTgvcevQ3LD92M1azKXNu6fz6LN3/unu8Pa6v4vP+1x1MDAwZoO/97JhXHUwMDFinu9fJX3/ZVa20+pFOaHiJFxu2+6NV09ar4uQuz66r27HLVx1MDAxMGDUXHUwMDFjhb1mK3Bjs1x1MDAwMmh0Nezajpf0zVxmUXb1ZVx1MDAxOfL9nuFcdTAwMWIj3JJcdTAwMDQhJrSWSKJsRfrpMlx1MDAxMItcdTAwMGKGmdRMXHUwMDEzrCQvSbZcdTAwMWL6YWQk+1x1MDAwNbvmL1x1MDAxM+3edtpNkC+oZ31sXleNRtbnaThfLInFqMZSMSGkXHUwMDE2So26tFxcr9lKjKDUolx1MDAxOFx0oTTjXHUwMDE0k5wgbqpcdTAwMTLMOFFYIJy1mOG7x/XUPP7KXHUwMDE0XHUwMDEx2Vx1MDAxZPfY3Fx1MDAxMvR8P7+UQX24lK9mlFx1MDAxOVx1MDAxMlx1MDAxZF75ls3P9N8vXHUwMDFiYN5cYlx1MDAwYoaYuM/JaOI5q2moa/dkd+uU9i7247uWUqfkK91cdTAwMWP1+zb8lInf69btXHUwMDE3I4RVY6BcdTAwMWJcdTAwMDW6o5nF+F7QLs/NXHUwMDBmnXZmt1x1MDAxYrmJjFx1MDAwMaYgZ1x1MDAxZStEVmFFY6SExFjPXHKVyZOeXGaVOFx1MDAwNEfxZqCU7srjXHUwMDA0f1x1MDAxZk40tTjSgmOsXHUwMDE4UqRcZlx1MDAxNIItiTVThL1cdTAwMWImSWRcdTAwMDdx147AsMahQoWluIEq0kRKytg4UiZgQ1x1MDAxMk4kWIp+PzZcblxyYyBYpJ1mUoVBcuVcclK/jFxuV1x1MDAwZuyO5/dcdTAwMGJKTVxyXHUwMDE4VnEnfN4sXFzc9r2mseRNXHUwMDA3hHWjgpEnXHUwMDFl8NGoQ8er1/OM4cBItlx1MDAxN7jR8TyOPoy8plx1MDAxN9j+p0mCwKzdo1dFYSunqns7dk2rua6mQnQqp5HcXHUwMDEyl3CKwcpcdTAwMTVjhM5cdTAwMGbUk1x1MDAwN0Fbd82TQey073aFfrDZlVpcdTAwMDNOY1x1MDAxNueaXHUwMDAyb1FgXGaGRFx1MDAxMavANlx1MDAxY1x1MDAwYiVcdTAwMDUhhvFwSbKV4jRcdO1cXGRcIq5cdTAwMDOnRW2BXHUwMDBmm/2tXHUwMDFlw18l7l5cdTAwMWOq3t71KnJaTiclrDDOIFx1MDAwMlRvgMrkSa82p1x0YWGmtKCaKEKIKOFEYUtIYDYkNKVcXLP34GQqqSlccp5QwyBMYoNcdTAwMTU9XHUwMDBllVx04OCYYirlXHUwMDAy4r114bRDu1x1MDAxN8eeXHUwMDFkLInYZnj7MrGNS7N0duOMl6+OolDCJVx1MDAwN23Mj9izZODsXHUwMDA39Nxx7I9su32x/fngNFh5cuNEWEJcdIhENVC5XCKZXHUwMDBi61x1MDAwZtM5zCnkbGVG+Vx1MDAwZWq7J1xycn+/LGpcdTAwMTNUXHUwMDAxtS1cdTAwMDK+P5Danlx1MDAxYdtcdTAwMTdfwpPbk+2oe/PQbttHztb5XG5SXHUwMDFiz9lROVxmlFxi0mRcdTAwMTNcdTAwMWLNjZTJs15pbuOSWVx1MDAxMDhBXHUwMDE0SFx0kTznXHUwMDE2UphQZlGklFbGbah3XHUwMDAyZSq3SWExrTWhXHUwMDEyXHRcdTAwMDRcdTAwMGVqLm5cdTAwMDN8S0xcdTAwMTH9ifK1y/BcdTAwMWXoKl5cdTAwMTK1zfD1ZWpcdTAwMWJcdTAwMTNm6cxcdTAwMDaRTyVgNeBcdTAwMTWylVxcojJcdTAwMGKw7Klx1r8n57Sp7pJcdTAwMGb93duDxlx1MDAxNVlcdTAwMDNqk1x1MDAxNuOcKyxcdTAwMDRcdTAwMDfjz+Zr7qeCWJhobFqQWGFq40pTIYVeL2b7LFx1MDAxYX/sheGF83HQOm5cdTAwMWZF22fhw+VcbjJcdTAwMWKk9JVAgVxchplcdTAwMDRibpxMnvRqXHUwMDEzm1KWklx1MDAxY2tFXHUwMDA1M+RVXHUwMDA0iVx1MDAwNOekXHUwMDE4U0yBLpZKbExbkLNcdTAwMDFcdTAwMDaQUJBcdTAwMWTSXFwkN4XZuClpKKxcdTAwMTdQ0VhcdTAwMTdmu1x1MDAwMjLxl8RrM1x1MDAxY32Z10qiLJ3VXHUwMDA0rszXIP5USFx1MDAxMcbm32H78vHvXHUwMDBmZ1dcdTAwMGZfXHUwMDFluo/3R1Q1XHUwMDFlxd1OXHUwMDE1WleJ1SBcdTAwMDKkhFx1MDAxMkkk4qhcdTAwMDRYZmpcdTAwMWZcdTAwMTjwQzjRJF/6WDVaI1x1MDAxONiXyYVsXCL8QF5TPYS9zte9yG9cdTAwMWWe3/Kzu6v9xtZcbvJcdTAwMWFX1VCRoDtEhZg/Y5s869UmNiFcdTAwMDFcdFgzxlx1MDAxNVx1MDAwMphcdTAwMTSjP6aVRcE2XHUwMDAxQ1xia/6+ov1UXtNcYvhcdTAwMTV4jSomIYMkc9GaZpDcQT7587Daqd31QblLK0bOcPZlZpsgztLZjZLqnI2BNlx1MDAxMFU8XHUwMDFidFx1MDAxNmQp6EB/XGLdPWf/cL9/5HZPLs7uKiDrRGFcdTAwMWNvtezEaa1cdTAwMDDDXHRcblxmhzhkbYBcdTAwMTYty9tcYlxm8jZBgDikwHKlz5BcdTAwMDBNwyOUykKSdWC4nlx1MDAwNC/VdqI+Y59uTj9e3e56Xz/lXHUwMDE47tfJj1x1MDAxZO7wXHUwMDFld662P1x1MDAxYz9FXfs56V1v+XV5+KU4yuv4dlx1MDAxNIVPK8icRFVcdTAwMWXjolRqRPJF5lkonLyYK02cXHUwMDAyqFx1MDAxMXMgK620XHUwMDA0r1MsdVx1MDAxMo7B6Fx1MDAxNcacUEaXeDKFKUtTrSXW6bZcdTAwMDSejzgxolhyqelPtI33h7s01pxBXCJl1ixKslxiwnxxXHUwMDEyXHUwMDEzUIp5JVkqxSGiy0dPM8+lTPVaq8yVUlx1MDAxMVx1MDAwYqxdKZZcdTAwMWXfosVskCBqKZzutr9cdTAwMTOqlamgwFx1MDAxNsKMXHROKYw2XHUwMDExpVRakI1A1sHTXHUwMDFki1x1MDAwMmNcdTAwMGaJXHUwMDEygWeFqSylxElmXHUwMDEz5Sws07xNz4vlOLGjZMdcdTAwMGLqXtAsXG42PGf8XHUwMDAysYjvJ4m+6bePT1x1MDAwN7x/s9/qPu3wXHUwMDFjY1x1MDAwMvqdXmog5sCgxoorXHUwMDEwi1x1MDAxMpKtllkvu5uCwpIgN2GYYGRUPjZ1N6jPXHUwMDE2aTrqc1wibSGLXHUwMDEwTFx1MDAwNdMgXHUwMDFhQkgoLMaFXHUwMDFhXHUwMDEzwrfjZDfsdLxcdTAwMDSW+lwi9IKkvKTp2m1cdTAwMWLst1xce0zfMIl8W9lJdM1cdTAwMTOLXHUwMDAxUPapllx1MDAwMSj9Mvr8169cdTAwMTN7b1FYd6GHOWR+zWs14EkpXHUwMDE4MVkmXHUwMDA06Fx1MDAxMKzOfFglWsxrXHUwMDFjJ9nzNvLvb41oROW5JMUo55CYvuFcXNJUc11pV1x0cVxyx1x1MDAxOCNcdTAwMDUxeSF0Se9XoE2EX2OeZblLcNdYa1xyclx1MDAxNFOXaSFccjbHoVx1MDAxMZZcdTAwMGJII6aHNOtcdTAwMTPYvy9gulx1MDAwZU4h+LCjiqDJd1x1MDAxYsmUkClcdLtV8VJB4nJwND7qXCJcdTAwMDKkysOItFx1MDAxMvTUXHUwMDFjXHUwMDA1oHj+7V83eWJcdTAwMGX9/Ph8si/4l7uDo1x1MDAwM3R+s1x1MDAxNpgnTFuEcaSEXHUwMDEw2vzipFx1MDAxNFx1MDAxZjFhUXC2mku0vONNWFpcdTAwMDBg8LNcdTAwMDRcdTAwMDHmsZxwZINRXHUwMDBiXHUwMDBihDQnmFx1MDAxNX3T6z5cdTAwMTcwumaYr31FkDKLk1Hthmld6DRt26tcdTAwMTOGSevHQrY85lxcgKXou1x1MDAwMEtQZcGemvJcdTAwMTPHb/jxWNxI+jefWlx1MDAxZusxb7BbMkCDa7fq9PCKIZZcdTAwMTNIWUxFXHJcdTAwMDFcXMr70YxoSyCIwyBdWN72ltRcdTAwMTZSXHUwMDFjXHUwMDFlLyi8azq59FdcdTAwMDBs7jDzXHUwMDBiYIWGW3k+S/3ZXHUwMDAwu19vuj9cdTAwMTauxVx1MDAxMVx1MDAxN1x1MDAwMda011x1MDAwNLDqSnLFkHyZNFxiz18jvOxcIrHvXHLOd1x1MDAwZVx1MDAxZS/JXHTvXXKy1V9cdTAwMGawMmKB39KainI5MD09XHUwMDAyzYghgLRcdTAwMDAssCWhVXAgcVx1MDAwMlx1MDAwZVKWfivXypSvXHUwMDE5+Fx1MDAxMvAoxmdMqD9gXHUwMDBl2ZspNGaJ/mpcdTAwMTUgvlx1MDAwYsSlXHUwMDAyRDmFrmhZcHJeaFtoZl6ld/NcdTAwMWHTePawjfz7W3FfnUlDWFx1MDAwNzZcdTAwMDROf/5UWt7ovWtfPN/cXHUwMDBl2kk9OLlcbqKjk7XAvUbYolRcdTAwMDPwS6nySyZtYm6lJFIsbVclwVx1MDAxNlx1MDAwM3tcbq5cdTAwMDWGQcWCYlZ0XHUwMDE01FJgXHUwMDE3SCqBzdG1MczjdHOPyKX8XHUwMDE47p2YXHUwMDA3XHUwMDE15Cb1f8y/vrYmat28xvT9RsRXhuVcXJSvjiBPKUK8UJiZXHUwMDA1+dDnXHUwMDBm3cFFfHmvlNPvXHUwMDFmPtPBg7dcdTAwMWWQh4iXXHUwMDExisZS5TQs59ySSiOEwXrVe7dcdTAwMDUrIU9cYrKo1Fx1MDAxMJqTl/8/YkJgPoHcXHUwMDE5klhcdTAwMTCK/6e5M6dIZCu67Fxul9dp1rZqcZq+1v5dcyEw/jP4MzDvtX/VTCtcXFxmWjZcdTAwMThy/cfG6N8n2VxcsbxcdTAwMThWyjaG7mPT7navXHUwMDEy0MPIQ4PivfpwMTMpN1x1MDAxZj33aWf69vTG0HNcdTAwMTiIuqnL/7bx7b/96mCNIn0= BoxGaussianRobertsSobelLaplacianMeanUnLinearSmoothEdgeimg - smooth = edgeedge + img = enhanced


卷积

一维卷积:反转,相乘相加。假设有两个一维连续信号进行卷积,公式如下。

(gf)(t)=f(τ)h(tτ)dτ

二维卷积其实是“相关”,因为缺少了反转的这一步骤,但是由于卷积核大部分都是对称的,所以可以忽略这一条件。所以图像卷积就是对应位置相乘相加!图片的卷积公式如下。

T(x,y)=i=abj=abI(x+i,y+j)k(i,j)

降噪/平滑

Box

均值滤波器(盒式滤波器),就是某个“方块”内的像素求均值。

k=1mn[11...111...1............11...1]mn

gitbook/assets/image (49).png

Code
from matplotlib import pyplot as plt
from scipy.ndimage import convolve
import skimage.data as data
import numpy as np

image = data.camera().astype(np.float32)

convolved_image1 = convolve(image, np.ones((3,3))/9.0, mode='reflect')
convolved_image2 = convolve(image, np.ones((5,5))/25.0, mode='reflect')

plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 3, 2)
plt.imshow(np.abs(convolved_image1), cmap='gray')
plt.title('Convolved by Box(3,3)')
plt.axis('off')

plt.subplot(1, 3, 3)
plt.imshow(np.abs(convolved_image2), cmap='gray')
plt.title('Convolved by Box(5,5)')
plt.axis('off')

plt.tight_layout()
plt.show()

Gaussian

Box 太平均了,边缘损失严重,为了提升“保边”效果,进行高斯加权平均。

G(x,y)=12πσ2ex2+y22σ2W(i,j)=G(i,j)i=aai=bbG(i,j)

gitbook/assets/image (50).png

Code
from matplotlib import pyplot as plt
from scipy.ndimage import convolve
import skimage.data as data
import numpy as np

image = data.camera().astype(np.float32)

k1 = np.array([[1,2,1],[2,4,2],[1,2,1]])
k2 = np.array([[1, 4, 7, 4,1],
               [4,16,26,16,4],
               [7,26,41,26,7],
               [4,16,26,16,4],
               [1, 4, 7, 4,1]])

convolved_image1 = convolve(image, k1, mode='reflect')
convolved_image2 = convolve(image, k2, mode='reflect')

plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 3, 2)
plt.imshow(np.abs(convolved_image1), cmap='gray')
plt.title('Convolved by Gaussian(3,3)')
plt.axis('off')

plt.subplot(1, 3, 3)
plt.imshow(np.abs(convolved_image2), cmap='gray')
plt.title('Convolved by Gaussian(5,5)')
plt.axis('off')

plt.tight_layout()
plt.show()

Mean

以上滤波器均为线性滤波,而中值滤波是一种基于统计的非线性滤波,它是椒盐噪声的“特效药”。

gitbook/assets/image (51).png

Code
from matplotlib import pyplot as plt
from skimage import data, util, filters
import numpy as np

image = data.camera()

noisy_image = util.random_noise(image, mode='s&p',rng=None,clip= True)

filtered_image = filters.median(noisy_image)

plt.figure(figsize=(10, 5))
plt.subplot(1, 3, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 3, 2)
plt.imshow(np.abs(noisy_image), cmap='gray')
plt.title('Noisy Image')
plt.axis('off')

plt.subplot(1, 3, 3)
plt.imshow(filtered_image, cmap='gray')
plt.title('Filtered Image')
plt.axis('off')

plt.tight_layout()
plt.show()

边缘

Roberts

2x2大小的求边缘。

Gx=[1001]Gy=[0110]

gitbook/assets/image (52).png

Code
from skimage import data, filters
from matplotlib import pyplot as plt
import numpy as np

img = data.camera()

img_robert_pos = filters.roberts_pos_diag(img)
img_robert_neg = filters.roberts_neg_diag(img)
# ROBERTS_PD_WEIGHTS = np.array([[1, 0],
#                                [0, -1]], dtype=np.float64)
# ROBERTS_ND_WEIGHTS = np.array([[0, 1],
#                                [-1, 0]], dtype=np.float64)
img_robert = filters.roberts(img)
# out = np.sqrt(roberts_pos_diag(image, mask) ** 2 +
#                 roberts_neg_diag(image, mask) ** 2)
# out /= np.sqrt(2)

def plot(n,i,title,img):
    plt.subplot(1, n, i+1)
    plt.imshow(np.abs(img), cmap='gray')
    plt.title(title)
    plt.axis('off')

for i,(title,im) in enumerate(zip(
    ['Original Image','Roberts pos','Roberts neg','Roberts'],
    [img,img_robert_pos,img_robert_neg,img_robert])):
    plot(4,i,title,im)

plt.tight_layout()
plt.show()

Sobel

3x3 大小的边缘

Gx=[121000121]Gy=[101202101]

gitbook/assets/image (53).png

Code
from skimage import data, filters
from matplotlib import pyplot as plt
import numpy as np

img = data.camera()

img_sobel_h = filters.sobel_h(img)
img_sobel_v = filters.sobel_v(img)
# SOBEL_EDGE = np.array([1, 0, -1])
# SOBEL_SMOOTH = np.array([1, 2, 1]) / 4
# HSOBEL_WEIGHTS = SOBEL_EDGE.reshape((3, 1)) * SOBEL_SMOOTH.reshape((1, 3))
# VSOBEL_WEIGHTS = HSOBEL_WEIGHTS.T
img_sobel = filters.sobel(img)

def plot(n,i,title,img):
    plt.subplot(1, n, i+1)
    plt.imshow(np.abs(img), cmap='gray')
    plt.title(title)
    plt.axis('off')

for i,(title,im) in enumerate(zip(
    ['Original Image','Sobel H','Sobel V','Sobel'],
    [img,img_sobel_h,img_sobel_v,img_sobel])):
    plot(4,i,title,im)

plt.tight_layout()
plt.show()

Laplacian

Sobel 和 Robert 把 3x3 或者 2x2 的区域当成一个大像素,算这个像素内部的梯度。Laplacian 换了一个角度,找一个 3x3 的区域,算这个区域中心往外的梯度。另外,实践中,尝尝采用中心权重为正的形式,虽然按照梯度公式中心应该是负。

G=[010141010]

或者加上四个对角线方向

G=[111181111]

另外,可以把边缘加到原图上得到锐化图像。

gitbook/assets/image (56).png

Code

from skimage import data, filters
from matplotlib import pyplot as plt
import numpy as np

img = data.camera()
lap_img = filters.laplace(img)*255

def plot(n,i,title,img):
    plt.subplot(1, n, i+1)
    plt.imshow(np.abs(img), cmap='gray',vmin=0,vmax=255)
    plt.title(title)
    plt.axis('off')

for i,(title,im) in enumerate(zip(
    ['Original Image','Laplace Edge','Origin+Edge','Origin+2Edge'],
    [img,lap_img,lap_img+img,2*lap_img+img])):
    plot(4,i,title,im)

plt.tight_layout()
plt.show()