一、图像阈值处理
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