基于opencv的图像形态学操作 (腐蚀 膨胀 开闭 击中击不中)

腐蚀与膨胀:

'''
实验题
腐蚀操作
膨胀操作
开运算操作
闭运算操作
'''

import cv2
import numpy as np

# 变量接受的TrackerBar的位置参数
MaxIterationNum = 5
ErodeDilate = 0
OpenClose = 0
switch = "0:Erode /n 1:Dilate"
switch1 = "0:OPEN /n 1:CLOSE"

def load_image(path):
    src = cv2.imread(path,1)
    #src = cv2.imread(path,1)
    if (src == None).all():
        print("读取原始图片错误!")
        return False
    # cv2.imshow("original_picture:",src)
    # cv2.waitKey(0)
    # cv2.destroyWindow("original_picture:")
    return src

def erode_and_dilate_image(src,number,flag):
    #定义 kernel大小
    d= number
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(d,d))
    #通过if操作来判断到底是执行膨胀还是腐蚀
    if flag == 1:#执行图像膨胀操做
       dst= cv2.erode(src,kernel)
       return dst
    else:#执行图像腐蚀操做
       dst = cv2.dilate(src,kernel)
       return dst

def open_and_close_image(src,number,flag):
    # 定义 kernel大小
    d = number
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (d, d))
    if flag == 1:#执行形态学操做之开操作
       dst = cv2.morphologyEx(src,cv2.MORPH_OPEN,kernel)
       return dst
    else:#执行形态学操作之闭操作
       dst = cv2.morphologyEx(src,cv2.MORPH_CLOSE,kernel)
       return dst
# 由于回调函数只能传一个参数,不方便,所以需要pass
def nothing(pos):
    pass

if __name__ == '__main__':


    path_of_image = '3.jpg'
    # read original picture
    src = load_image(path_of_image)

    cv2.namedWindow("erode_and_dilate_image")
    cv2.createTrackbar("EandD", "erode_and_dilate_image", ErodeDilate, MaxIterationNum * 2 + 10,nothing)
    cv2.createTrackbar(switch, "erode_and_dilate_image", 0, 1, nothing)

    cv2.namedWindow("open_and_close_image")
    cv2.createTrackbar("Open_and_Close","open_and_close_image",OpenClose,MaxIterationNum*2+10,nothing)
    cv2.createTrackbar(switch1,"open_and_close_image",0,1,nothing)

    while True:
        d = cv2.getTrackbarPos("EandD", "erode_and_dilate_image")
        s = cv2.getTrackbarPos(switch, "erode_and_dilate_image")
        dst = erode_and_dilate_image(src,d+1,s)
        cv2.imshow("erode_and_dilate_image",dst)

        d1 = cv2.getTrackbarPos("Open_and_Close","open_and_close_image")
        s1 = cv2.getTrackbarPos(switch1, "open_and_close_image")
        dst1 = open_and_close_image(src,d1+1,s1)
        cv2.imshow("open_and_close_image", dst1)
        #在英文输入法下,按下q键退出
        if cv2.waitKey(1)&0xff == ord("q") :
            break
            pass




                     

提取边缘:

import cv2
import numpy as np

if __name__ == "__main__":
    src = cv2.imread("3.jpg")
    cv2.namedWindow("original_image")
    cv2.imshow("original_image",src)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
    dst = cv2.dilate(src,kernel)-cv2.erode(src,kernel)
    cv2.imshow("processed_image",dst)
    cv2.imwrite('dst.jpg',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

 击中与击不中:

import cv2
# from cv2.cv import CreateImage
import numpy as np

#击中击不中函数功能
min_threshold = 180
max_threshold = 255
if __name__ == "__main__":

     src =cv2.imread("A.png")
     src1=cv2.imread("B.png")
     gray_src  = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
     gray_src1 = cv2.cvtColor(src1,cv2.COLOR_BGR2GRAY)
     cv2.imshow("gray_src",gray_src)
     cv2.imshow("gray_src1",gray_src1)
     cv2.threshold(gray_src,min_threshold,max_threshold,cv2.THRESH_BINARY)
     cv2.threshold(gray_src1,min_threshold,max_threshold,cv2.THRESH_BINARY)

     #将图片A的灰度图取反获得反色图
     gray_src_inverse = cv2.bitwise_not(gray_src)
     gray_src1=cv2.copyMakeBorder(gray_src1, 1, 1, 1, 1, cv2.BORDER_CONSTANT,value=255)
     gray_src1_inverse = cv2.bitwise_not(gray_src1)
     #第一次腐蚀
     first_erode = cv2.erode(gray_src,gray_src1)
     cv2.imshow("first_erode.jpg",first_erode)
     #第二次腐蚀
     second_erode = cv2.erode(gray_src_inverse, gray_src1_inverse)
     cv2.imshow("second_erode.jpg", second_erode)
     #击中击不中
     thrid_image = cv2.bitwise_and(first_erode,second_erode)
     cv2.imshow("third_image.jpg",thrid_image)
     cv2.threshold(thrid_image,0,max_threshold, cv2.THRESH_BINARY)
     cv2.imwrite("dst1.jpg",thrid_image)
     #结果有些小需要放大来看
     cv2.waitKey(0)
     cv2.destroyAllWindows()

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值