图像处理-------图像形态学

形态学:是分析几何形状和结构的数学方法,它建立在集合代数的基础上,是用集合论方法定量描述目标几何结构的学科

图像处理中的运用:

(1).去除干扰噪声

(2).边界提取

(3).目标定位

(4).区域填充

图像腐蚀:表示用某种“探针”(即某种形状的基元或结构元素)对一个图像进行探测,以便找出在图像内部可以放下该基元的区域

几何A被集合B腐蚀,表现为A  \ominus B,数学形式为: 

A  \ominus B = {x:B+x\subsetA}

opencv自带函数代码实现:

import cv2 
import numpy as np
import matplotlib.pyplot as plt
# 读取原始图像
imgGray = cv2.imread(r"D:\picture\pic01.jpg", flags=0)  # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  # 二值化处理
# 图像腐蚀
kernel = np.ones((3,3), dtype=np.uint8)  # 生成盒式卷积核;  (3, 3):卷积核的尺寸
imgErode = cv2.erode(imgBin, kernel=kernel)  # 腐蚀图像

plt.subplot(1,2,1),plt.imshow(imgBin),plt.titlt('Origin')
plt.subplot(1,2,2),plt.imshow(imgErode),plt.title('erode KSize=(3,3)')

图像处理-------图像形态学_第1张图片

 

函数实现:

def Erode(img):
    h,w = img.shape
    out = img.copy()
    kernel = np.array(((0,1,0),(1,0,1),(0,1,0)),dtype=np.int)
    for i in range(1):
        tmp = np.pad(out,(1,1),'edge')
        for y  in range(1,h):
            for x in range(1,w):
                if np.sum(kernel*tmp[y-1:y+2,x-1:x+2]) < 255*4:
                    out[y,x] = 0
    return out

 

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img =  cv.imread(r"D:\picture\pic01.jpg",flags = 0)
ret, imgBin = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  # 二值化处理
erode_img = Erode(imgBin)
cv.imshow(erode_img)
cv.waitKey(0)

 

图像处理-------图像形态学_第2张图片

 

 图像膨胀:膨胀 类似与 ' 领域扩张 ' ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大,求局部最大值的操作,将 1 值扩充到邻近像素,从而扩大白色值范围、压缩黑色值范围。

几何A被集合B膨胀,表现为A  \oplus B,数学形式为: 

A  \oplus B= {x:(B+x)\capA\neq\varnothing

A  \oplus B表示将B平移后仍然击中A的所有点x组成的集合。

opencv自带函数实现:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 读取原始图像
imgGray = cv2.imread(r"D:\picture\pic01.jpg", flags=0)  # flags=0 读取为灰度图像
ret, imgBin = cv2.threshold(imgGray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  # 二值化处理

# 图像膨胀
kSize = (3, 3)  # 卷积核的尺寸,可以改变(5,5),(7,7)...
kernel = np.ones(kSize, dtype=np.uint8)  # 生成盒式卷积核
imgDilate = cv2.dilate(imgBin, kernel=kernel)  # 膨胀图像

plt.subplot(1,2,1),plt.imshow(imgBin),plt.titlt('Origin')
plt.subplot(1,2,2),plt.imshow(imgDilate),plt.title('dilate KSize=(3,3)')

图像处理-------图像形态学_第3张图片

函数实现: 

def Expand(img):
    h,w = img.shape
    kernel = np.array(((0,1,0),(1,0,1),(0,1,0)),dtype=np.int)
    out = img.copy()
    for i in range(1):
        tmp = np.pad(out,(1,1),'edge')
        for y in range(1,h):
            for x in  range(1,w):
                if np.sum(kernel*tmp[y-1:y+2,x-1:x+2]) >= 255:
                    out[y,x] = 255
    return out

 

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img =  cv.imread(r"D:\picture\pic01.jpg",flags = 0)
ret, imgBin = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  # 二值化处理
expand_img = Expand(imgBin)
cv.imshow(expand_img)
cv.waitKey(0)

图像处理-------图像形态学_第4张图片

 

你可能感兴趣的:(数字图像处理,图像处理,计算机视觉,人工智能)