计算机视觉-OpenCV(二)

一、图像阈值处理

ret,dst=cv2.threshold(src,thresh,maxval,type)

释义:
dst:输出图
src:输入图,只能输入单通道图像,通常来说是灰度图
thresh:阈值(0-255之间数字)
maxval:当像素值超过阈值(或小于阈值,根据type决定),所赋予的值
type:
    cv2.THRESH_BINARY      超过阈值部分去maxval(最大值),否则取0
    cv2.THRESH_BINARY_INV   THRESH_BINARY的反转
    cv2.THRESH_TRUNC       大于阈值部分设为阈值,否则不变
    cv2.THRESH_TOZERO      大于阈值部分不改变,否则设为0
    cv2.THRESH_TOZERO_INV   cv2.THRESH_TOZERO的反转

import cv2   #OpenCV读取格式是BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

img1=cv2.imread('GRAY.png')

ret,dst1=cv2.threshold(img1,127,255,cv2.THRESH_BINARY)
ret,dst2=cv2.threshold(img1,127,255,cv2.THRESH_BINARY_INV)
ret,dst3=cv2.threshold(img1,127,255,cv2.THRESH_TRUNC)
ret,dst4=cv2.threshold(img1,127,255,cv2.THRESH_TOZERO)
ret,dst5=cv2.threshold(img1,127,255,cv2.THRESH_TOZERO_INV)

title=['1','2','3','4','5','6']
images=[img1,dst1,dst2,dst3,dst4,dst5]

for i in range(6):
    plt.subplot(2,3,i+1),plt.title(title[i])
    plt.imshow(images[i],'gray')
    plt.xticks([]),plt.yticks([])
#plt.show

二、图像平滑

2.1均值滤波

简单的平均卷积操作:指定核的大小(3,3),3×3的像素点每个数相加再除9。

实际是通过卷积矩阵实现,构建3×3每个点为1的矩阵,与图像中每个3×3矩阵求内积(对应点位相乘),再求平均

#均值滤波
img=cv2.imread('pic.jpg')
#指定核的大小(3,3),3×3的像素点每个数相加再除9。
#实际是通过卷积矩阵实现,构建3×3每个点为1的矩阵,与图像中每个3×3矩阵求内积(对应点位相乘),再求平均
blur=cv2.blur(img,(3,3))
cv2.imshow('test',blur)
cv2.waitKey(0)
cv2.destroyAllWindows

2.2方框滤波

box=cv2.boxFilter(img,-1,(7,7),normalize=True)

释义:

-1:正常无需修改

normalize=True时与均值滤波相同,每(3×3)点位求和平均值。

normalize=False时,每(3×3)点位求和,超过255就取255。

#方框滤波(归一化)
#normalize=True时与均值滤波相同,每(3×3)点位求和平均值。
box=cv2.boxFilter(img,-1,(7,7),normalize=True)
cv2.imshow('test',box)
cv2.waitKey(0)
cv2.destroyAllWindows




#方框滤波(不归一化)
#normalize==False时,每(3×3)点位求和,超过255就取255。
box=cv2.boxFilter(img,-1,(3,3),normalize=False)
cv2.imshow('test',box)
cv2.waitKey(0)
cv2.destroyAllWindows

2.3高斯滤波

高斯分布:越靠近中间,值越大,越重要

实现也是通过构建矩阵,但越靠近中心点矩阵比重越大,最大为1,再与图像矩阵求内积

#高斯滤波
#高斯分布(越靠近中间,值越大,越重要)
#也是构建矩阵,但越靠近中心点矩阵比重越大,最大为1,再与图像矩阵求内积
aussian=cv2.GaussianBlur(img1,(5,5),1)
cv2.imshow('test',aussian)
cv2.waitKey(0)
cv2.destroyAllWindows

2.4中值滤波

将图像的像素点排序,取中值

#中值滤波
#将图像的像素点排序,取中值
median=cv2.medianBlur(img1,5)
cv2.imshow('test',median)
cv2.waitKey(0)
cv2.destroyAllWindows


#图像拼接显示
res=np.hstack((median,aussian))
cv2.imshow('test',res)
cv2.waitKey(0)
cv2.destroyAllWindows

三、形态学操作

3.1腐蚀操作

去除图像类似毛刺等杂质的操作

#核:选择多大的核进行腐蚀操作
kernal=np.ones((5,5),np.uint8)
#iterations:迭代次数,进行几次腐蚀操作
erosion=cv2.erode(img,kernal,iterations=2)
cv2.imshow('test',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows

3.2膨胀操作

与腐蚀操作相反,使图像内容膨胀

kernal=np.ones((5,5),np.uint8)

dilate=cv2.dilate(erosion,kernal,iterations=2)
cv2.imshow('test',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows

3.3开运算

开运算:先腐蚀再膨胀

#开运算:先腐蚀再膨胀
kernal=np.ones((5,5),np.uint8)
opening=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernal)
cv2.imshow('test',opening)
cv2.waitKey(0)
cv2.destroyAllWindows

3.4闭运算

闭运算:先膨胀再腐蚀

#闭运算:先膨胀再腐蚀
kernal=np.ones((5,5),np.uint8)
opening=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernal)
cv2.imshow('test',opening)
cv2.waitKey(0)
cv2.destroyAllWindows

3.5梯度运算

梯度运算=膨胀后的图像-腐蚀后的图像

#梯度运算=膨胀后的图像-腐蚀后的图像
kernal=np.ones((5,5),np.uint8)
dilate=cv2.dilate(img,kernal,iterations=5)
erosion=cv2.erode(img,kernal,iterations=5)
res=np.hstack((dilate,erosion))
cv2.imshow('test',res)
cv2.waitKey(0)
cv2.destroyAllWindows

3.6礼帽与黑帽

礼帽:原始图像-开运算结果(只剩毛刺)

黑帽:闭运算结果-原始图像(只剩图像边缘)

#礼帽:原始图像-开运算结果
kernal=np.ones((5,5),np.uint8)
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernal)
cv2.imshow('test',tophat)
cv2.waitKey(0)
cv2.destroyAllWindows



#黑帽:闭运算结果-原始图像
kernal=np.ones((5,5),np.uint8)
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernal)
cv2.imshow('test',blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值