腐蚀与膨胀:
'''
实验题
腐蚀操作
膨胀操作
开运算操作
闭运算操作
'''
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()