python+opencv图像处理基础(六)————图像腐蚀、膨胀、阈值化处理

目录

      • 1.对一个图像的简单操作
        • 1.1 读取图像并转换为灰度图
        • 1.2 二值化处理 :大于阈值使用maxval(255)表示,小于阈值使用0表示
        • 1.3 腐蚀处理: 将图像中的高亮区域或白色部分进行缩减细化
        • 1.4 图像膨胀:将图像中的高亮区域或白色部分进行扩张
        • 1.5图像开运算:先腐蚀后膨胀 有利于去除噪声(去除黑色区域中的白点)
      • 2. 阈值化方法的比较

1.对一个图像的简单操作

import cv2
import numpy as np
import matplotlib.pyplot as plt

from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc",size = 14)

1.1 读取图像并转换为灰度图

im1 = cv2.imread('D:\pythonb\wx01.jpg')
im2 = cv2.cvtColor(im1,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)

1.2 二值化处理 :大于阈值使用maxval(255)表示,小于阈值使用0表示

ret,im_fixed = cv2.threshold(gray,120,255,cv2.THRESH_BINARY)  #ret:阈值;  im_fixed:处理结果

1.3 腐蚀处理: 将图像中的高亮区域或白色部分进行缩减细化

图像腐蚀的过程:
a.图像二值化,将图像的灰度值根据阈值进行0,1处理得到的图像;
b.卷积核,对应信号处理中的高低频滤波器。常用numpy去设置,np.ones((m,n), np.uint8) 表示指定m*n的卷积核;
c.图像的腐蚀,cv2.erode(二值化图像, 卷积核, 迭代次数)

原文链接:https://blog.csdn.net/weixin_39128119/article/details/8417238

灰度级中的0表示白色;1表示黑色。将设置的卷积核与原图像做’与’运算,如果都为0,则标志点为0,否则为1。

#设置卷积核:可调节大小
kernel = np.ones((10,10), np.uint8)
f_sh = cv2.erode(im_fixed, kernel,5) #迭代5次

1.4 图像膨胀:将图像中的高亮区域或白色部分进行扩张

图像膨胀时腐蚀的逆过程,往往先通过腐蚀使图片线条变窄,然后腐蚀可以去除噪声。图像膨胀的处理过程:
a.图像二值化,将图像的灰度值根据阈值进行0,1处理得到的图像;
b.卷积核,对应信号处理中的高低频滤波器。常用numpy去设置,np.ones((m,n), np.uint8) 表示指定m*n的卷积核;
c.图像的腐蚀,cv2.dilate(二值化图像, 卷积核, 迭代次数)

原文链接:https://blog.csdn.net/weixin_39128119/article/details/8417238
卷积核与原图像做’或’运算,如果两者中有一为0,则标志点为0,否则为1

p_zh = cv2.dilate(im_fixed, kernel,5)
q_z = cv2.dilate(f_sh, kernel,5)   #把腐蚀处理过的图像再进行膨胀处理

1.5图像开运算:先腐蚀后膨胀 有利于去除噪声(去除黑色区域中的白点)

k_ys = cv2.morphologyEx(im_fixed, cv2.MORPH_OPEN, kernel)
#显示图像
titles1 = ["原图","灰度图","二值化处理",'腐蚀处理',"膨胀处理","先腐蚀后膨胀",'开运算']
images1 = [im2,gray,im_fixed,f_sh,p_zh,q_z,k_ys]

for i in range(7):
    plt.subplot(2,4,i+1)
    plt.imshow(images1[i],'gray')   ##"gray"!!!!!!显示的图像中有灰度图!!!!!!
    plt.title(titles1[i],FontProperties = font)
    plt.xticks([]), plt.yticks([])
plt.show()

运行结果如下:python+opencv图像处理基础(六)————图像腐蚀、膨胀、阈值化处理_第1张图片
结果分析:1)腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小;
2)膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大。
3)图6是对图3先进行腐蚀化,再进行膨胀化的操作。图7是直接对图3进行开运算操作,即:cv2.morphologyEx()。两者的运行结果几乎是一致的,开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界,同时并不明显改变其面积。

2. 阈值化方法的比较

这里不再赘述五种阈值化方法的原理,只执行代码进行比较。
运行代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc",size = 14)

im1 = cv2.imread('D:\pythonb\wx020.jpg')
im2 = cv2.cvtColor(im1,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)

ret,thresh1=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)     #二进制阈值化
ret,thresh2=cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV) #反二进制阈值化
ret,thresh3=cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)      #截断阈值化:>127的像素点变为127,<127的像素点值保持不变
ret,thresh4=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)     #阈值化为0: >127的像素点变为0; <127的像素点值保持不变
ret,thresh5=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV) #反阈值化为0:<127的像素点变为0,>127的像素点值保持不变

#显示结果
titles = ['原图','灰度图','二进制','反二进制','截断','TOZERO','TOZERO_INV']
images = [im2,gray, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(7):
   plt.subplot(2,4,i+1),plt.imshow(images[i],'gray')
   plt.title(titles[i],fontproperties= font)
   plt.xticks([]),plt.yticks([])
plt.show()

注意:阈值化处理是在灰度图的基础上操作的
运行结果如下:python+opencv图像处理基础(六)————图像腐蚀、膨胀、阈值化处理_第2张图片
(by dxz 2020 03 16 13:50)

一天不学习 电脑落尘灰
接下来准备去学习卷积神经网络了,需要学的知识还有好多好多,这几天看了点理论知识,看是头大,编程操作更是没敢接触,还得搭建框架,配置环境,,,,,任务繁重啊

你可能感兴趣的:(python+opencv图像处理基础(六)————图像腐蚀、膨胀、阈值化处理)