[python opencv 计算机视觉零基础到实战]二十、镜像、腐蚀、膨胀、开运算、闭运算

1_bit 2021-01-19 23:49:13 5006

一、学习目标

  1. 了解图片如何进行镜像
  2. 了解图片如何进行腐蚀
  3. 了解图片如何进行膨胀
  4. 了解图片如何进行开运算
  5. 了解图片如何进行闭运算

上一节:[python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转

二、了解图片的一般操作(镜像、腐蚀、膨胀、开运算、闭运算)

2.1 了解如何对图片进行镜像操作

在opencv中,我们可以对图片进行镜像操作,镜像是指两个图片某一点开始进行对称。图片的镜像操作其实也是对图像数据进行的操作。
首先读取图片,并且创建一个可拖动的窗口,为了防止镜像后图片过大不利于观察:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)

随后获取图片的宽高以及通道,这是因为我们需要对一些数据进行操作,操作的话一定是需要宽高的。我们即将通过宽高创建一张图片,如果我们需要上下镜像,那么就是高度是原来图片的2倍长度。代码如下:

cv2.imshow('src', img)
imgshape = img.shape
height= imgshape[0]
width = imgshape[1]
c = imgshape[2]

随后创建一张高度2的图片,我们需要在这张图片中显示图片镜像的内容,如果镜像是上下进行镜像那么则是高度需要2:

代码如下:

dst = np.zeros([height*2, width, c], np.uint8)

之后就简单了,通过循环嵌套遍历图片的内容,并且从图片的第一列第一行开始给予数据,由于我们的图片是镜像的,所以第一列第一行所需要对称于最后一列最后一行:

代码如下:

for i in range( height ):
    for j in range( width ):
        dst[i,j] = img[i,j]
        dst[height*2-i-1,j] = img[i,j]

以上代码中dst[i,j] = img[i,j]为正常从第一行第一列开始往下对图片进行赋值,dst[height*2-i-1,j] = img[i,j]则表示从最下面一行开始网上赋值,所以height*2-i-1则依次表示从下网上的位置信息。完整代码如下:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)

imgshape = img.shape
height= imgshape[0]
width = imgshape[1]
c = imgshape[2]
dst = np.zeros([height*2, width, c], np.uint8)

for i in range( height ):
    for j in range( width ):
        dst[i,j] = img[i,j]
        dst[height*2-i-1,j] = img[i,j]
cv2.imshow('Image', dst)
cv2.imshow('src', img)
cv2.waitKey(0)

结果如下:

左右镜像和上下镜像相同,只需要将宽度改为2倍宽,循环的时候从最右边进行赋值依次赋值即可,然后长度宽度的循环位置调换一下即可,代码如下:

dst = np.zeros([height, width*2, c], np.uint8)

for i in range( width ):
    for j in range( height ):
        dst[j,i] = img[j,i]
        dst[j,width*2-i-1] = img[j,i]

结果如下:

2.2 了解如何对图片进行腐蚀操作

腐蚀是OpenCV中的形态学操作,腐蚀需要使用erode函数。腐蚀可以使眼色对比突出,但在某些图片上使用腐蚀会适得其反。例如如下案例:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("img_erode",cv2.WINDOW_NORMAL)

cv2.imshow('Image', img)
img_erode = cv2.erode(img,None,iterations=1)
cv2.imshow('img_erode',img_erode) 
cv2.waitKey()

以上代码中,腐蚀使用了erode函数,erode函数的iterations参数越大,腐蚀效果越明显,以下是为1时的腐蚀效果,我们发现在图案边缘处会有明显的黑边。

我们将iterations改为2:

img_erode = cv2.erode(img,None,iterations=2)

效果如下:
我们换一张图片:

2.3 了解如何对图片进行膨胀操作

膨胀操作的简单使用也是非常简单,使用dilate方法,用法与erode类似。膨胀操作也是用如其名,就是变胖。代码如下:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\sss11.png')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("img_dilate",cv2.WINDOW_NORMAL)

cv2.imshow('Image', img)
img_dilate = cv2.dilate(img,None,iterations=2)
cv2.imshow('img_dilate',img_dilate) 
cv2.waitKey()

效果如下:

2.4 了解如何对图片进行开运算与闭运算操作

先腐蚀后膨胀叫做开运算,可以用于降噪。开运算使用morphologyEx函数,需要传入一个卷积核。完整代码如下:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\5566.png')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("img_dilate",cv2.WINDOW_NORMAL)
kn=np.ones((5,5),np.uint8)#卷积核
cv2.imshow('Image', img)
img_dilate = cv2.morphologyEx(img,cv2.MORPH_OPEN,kn)
cv2.imshow('img_dilate',img_dilate) 
cv2.waitKey()

以上morphologyEx方法传入了img需要操作的图片,MORPH_OPEN表示需要进行的操作,此处为开运算,kn为卷积核。其它代码不再赘述。
结果如下:

闭运算一般可以取出前景物体中的小点,跟开运算用法没什么太大区别,就更改了一个方法而已,完整代码如下:

import cv2
import numpy as np
o=cv2.imread("image\\closing.bmp",cv2.IMREAD_UNCHANGED)
k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:

通过对比我们明显看到,前景内容中的黑点没了。

三、总结

  1. 了解图片进行镜像需要创建一张图片,上下镜像则需要高度2,左右镜像则需要宽度按2
  2. 了解图片进行腐蚀使用erode方法
  3. 了解图片进行膨胀需要使用dilate方法
  4. 了解图片进行开运算需要使用morphologyEx方法,传参cv2.MORPH_OPEN
  5. 了解图片进行开运算需要使用morphologyEx方法,传参cv2.MORPH_CLOSE
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
1_bit
红包 90 8 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
1_bit
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区