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

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()

运行结果如下:在这里插入图片描述
结果分析: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()

注意:阈值化处理是在灰度图的基础上操作的
运行结果如下:在这里插入图片描述
(by dxz 2020 03 16 13:50)

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PythonOpenCV实现直线检测,可以使用Hough变换来检测直线。Hough变换是一种常用的图像处理方法,可用于检测直线、圆等几何形状。 以下是一个简单的示例代码,使用Hough变换来检测直线并计算交点: ```python import cv2 import numpy as np # 读取图像 img = cv2.imread('test.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 边缘检测 edges = cv2.Canny(gray, 50, 150, apertureSize=3) # Hough变换检测直线 lines = cv2.HoughLines(edges, 1, np.pi/180, 200) # 计算交点 points = [] for i in range(len(lines)): for j in range(i+1, len(lines)): rho1, theta1 = lines[i][0] rho2, theta2 = lines[j][0] if abs(theta1 - theta2) < np.pi/4: continue a = np.array([[np.cos(theta1), np.sin(theta1)], [np.cos(theta2), np.sin(theta2)]]) b = np.array([rho1, rho2]) x0, y0 = np.linalg.solve(a, b) points.append((int(x0), int(y0))) # 绘制直线和交点 for line in lines: rho, theta = line[0] a = np.cos(theta) b = np.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 2) for point in points: cv2.circle(img, point, 5, (0,255,0), -1) # 显示图像 cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码,首先读取图像进行灰度转换和边缘检测。然后使用Hough变换检测直线,并计算交点。最后绘制直线和交点,并显示图像。 需要注意的是,在计算交点时,需要将两条直线的极坐标表示转换为直角坐标表示,并使用线性方程组求解。 希望这个例子能够帮助到你实现直线检测并计算交点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值