cv2 版本 3.4.3
一、灰度直方图+均衡化
def histogram_demo(image):
plt.hist(image.ravel(), 256, [0, 256])#ravel函数功能是将多维数组降为一维数组
plt.show()
import cv2
from matplotlib import pyplot as plt
import numpy as np
img = cv2.imread("1.png", 1)## 读取图片
#cv2.imshow("src-img",img)
cv2.namedWindow('src_image', 0)
cv2.resizeWindow('src_image', 400, 300)
cv2.imshow('src_image', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转化为灰度图
histogram_demo(gray)
#cv2.imshow("gray-img", gray)## 输出
cv2.namedWindow('gray-img', 0)
cv2.resizeWindow('gray-img', 400, 300)
cv2.imshow('gray-img', gray)
dst = cv2.equalizeHist(gray)# 灰度图均衡化
histogram_demo(dst)
#cv2.imshow("graydst", dst)## 输出
cv2.namedWindow('dst-img', 0)
cv2.resizeWindow('dst-img', 400, 300)
cv2.imshow('dst-img', dst)
#分解通道# 彩色图片均衡化处理
#(b, g, r) = cv2.split(img)
#bH = cv2.equalizeHist(b)
##gH = cv2.equalizeHist(g)
#rH = cv2.equalizeHist(r)
# 合并每一个通道
#result = cv2.merge((bH, gH, rH))
#cv2.imshow("merge-RGB", result)
cv2.waitKey(0) # waitKey() == waitKey(0),表示无限等待
二、图形减法(选择具有时间顺序的两张图片)
import cv2
from matplotlib import pyplot as plt
import numpy as np
img1=cv2.imread("11.jpg",1)
img2=cv2.imread("22.jpg",1)
#一定要将图片裁成一样大 具体可以看图片size
cropp1 = img1[0:452, 0:450]
cropp2 = img2[0:452, 0:450]
gray1 = cv2.cvtColor(cropp1, cv2.COLOR_BGR2GRAY)
gray2= cv2.cvtColor(cropp2, cv2.COLOR_BGR2GRAY)
cv2.namedWindow('image1', 0)
cv2.resizeWindow('image1', 400, 300)
cv2.imshow('image1', cropp1)
cv2.namedWindow('image2', 0)
cv2.resizeWindow('image2', 400, 300)
cv2.imshow('image2', cropp2)
substract_img = gray1-gray2
cv2.namedWindow('sub', 0)
cv2.resizeWindow('sub', 400, 300)
cv2.imshow('sub',substract_img)
cv2.waitKey(0)
#cv.imshow('subimage',substract_img)
三、图像平滑(均值屡破、中值滤波、高斯滤波)
#均值滤波、中值滤波、高斯滤波
import cv2
img=cv2.imread("11.png")#读取待处理图像
cv2.namedWindow('src_image', 0)
cv2.resizeWindow('src_image', 200, 200)
cv2.imshow('src_image', img)
#均值滤波
mean_dst=cv2.blur(img,(9,9)) #使用 blur 函数处理
cv2.namedWindow('mean_result', 0)
cv2.resizeWindow('mean_result', 200, 200)
cv2.imshow('mean_result', mean_dst)
#高斯滤波
g_dst=cv2.GaussianBlur(img,(9,9),0,0)
cv2.namedWindow('gass_result', 0)
cv2.resizeWindow('gass_result', 200, 200)
cv2.imshow('gass_result', g_dst)
#中值滤波
midd_dst=cv2.medianBlur(img,3)
cv2.namedWindow('middle_result', 0)
cv2.resizeWindow('middle_result', 200, 200)
cv2.imshow('middle_result', midd_dst)
cv2.waitKey(0)
四、图像锐化边缘检测算子
得到结果之后再叠加到原图上,图像加法 cv2.add
Roberts算子
#Roberts算子
import cv2
import matplotlib.pyplot as plt
import numpy as np
#读取图像
image = cv2.imread("11.jpg")
lena = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
#灰度转化处理
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#roberts算子
kernelx = np.array([[-1, 0], [0, 1]], dtype= int)
kernely = np.array([[0, -1], [1, 0]], dtype= int)
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
#转uint8
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
#加权和
Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
#叠加到原图上 可不做
cropp1 = image[0:200, 0:200]
cropp2 = Roberts[0:200, 0:200]
cropp3 = cv2.cvtColor(cropp2, cv2.COLOR_GRAY2RGB)
robertss= cv2.add(cropp1,cropp3)
cv2.waitKey(0)
cv2.namedWindow('robert_dst', 0)
cv2.resizeWindow('robert_dst', 200, 200)
cv2.imshow('robert_dst',robertss )
Sobel算子
#sobel算子
#转灰度图像
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#Sobel算子
x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0)#对x一阶求导
y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1)#对y一阶求导
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
#叠加到原图上 可不做
cropp1 = image[0:200, 0:200]
cropp2 = Sobel [0:200, 0:200]
cropp3 = cv2.cvtColor(cropp2, cv2.COLOR_GRAY2RGB)
sobel= cv2.add(cropp1,cropp3)
cv2.namedWindow('sobel_dst', 0)
cv2.resizeWindow('sobel_dst', 200, 200)
cv2.imshow('sobel_dst',sobel )
cv2.waitKey(0)
拉普拉斯算子
#拉普拉斯算法
dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize= 5)
Laplacian = cv2.convertScaleAbs(dst)
#叠加到原图上 可不做
cropp1 = image[0:200, 0:200]
cropp2 = Laplacian[0:200, 0:200]
cropp3 = cv2.cvtColor(cropp2, cv2.COLOR_GRAY2RGB)
laplacian= cv2.add(cropp1,cropp3)
cv2.namedWindow('laplac_dst', 0)
cv2.resizeWindow('laplac_dst', 200 ,200)
cv2.imshow('laplac_dst',laplacian )
cv2.waitKey()
自定义算子
import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np
def matrix_conv(arr,kernel):
n = len(kernel)
ans = 0
for i in range(n):
for j in range(n):
ans += arr[i,j]*float(kernel[i,j])
return ans
def conv_2(image,kernel):
n = len(kernel)
image_1 = np.zeros((image.shape[0]+2*(n-1),image.shape[1]+2*(n-1)))
image_1[(n - 1):(image.shape[0] + n - 1), (n - 1):(image.shape[1] + n - 1)] = image
image_2 = np.zeros((image_1.shape[0]-n+1,image_1.shape[1]-n+1))
for i in range(image_1.shape[0]-n+1):
for j in range(image_1.shape[1]-n+1):
temp = image_1[i:i+n,j:j+n]
image_2[i,j] = matrix_conv(temp,kernel)
new_image = image_2[(n-1):(n+image.shape[0]-1),(n-1):(n+image.shape[1]-1)]
return new_image
img1 = cv.imread("cat.jpg")
img2=img1[0:708, 0:850]
img=cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
kernel = np.array([[-1,-2,-1], [0,0,0], [1,2,1]]) #定义的一个卷积核
img_conv = conv_2(img,kernel)
plt.subplot(1,2,1)
plt.imshow(img,cmap='gray')
plt.subplot(1,2,2)
plt.imshow(img_conv,cmap='gray')
plt.show()
# kernel=
# -1 -2 -1
# 0 0 0
# 1 2 1
#sobel y方向检测算子
#突出垂直方向的边缘信息
五、关键点检测
SIFT
import cv2
import numpy as np
img = cv2.imread('C:\\Users\\86178\\Desktop\\cat.png')#读取要处理的图片
cv2.namedWindow('src-img', 0)
cv2.resizeWindow('src-img', 400, 400)
cv2.imshow('src-img', img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度图像
fd_alg = cv2.SIFT_create()
keypoints,descriptor = fd_alg.detectAndCompute(gray,None)#进行算法的检测和计算
img1 = cv2.drawKeypoints(image = img,outImage = img,keypoints = keypoints,
flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
color = (0, 0, 255))
cv2.namedWindow('sift-keypoints', 0)
cv2.resizeWindow('sift-keypoints', 400, 400)
cv2.imshow('sift-keypoints', img1)
cv2.waitKey(0)
六、腐蚀与膨胀
腐蚀
import cv2
import numpy as np
img = cv2.imread('11.jpg',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('src',img)
cv2.imshow('show',erosion)
cv2.waitKey(0)
膨胀
import cv2
import numpy as np
img = cv2.imread('11.jpg',0)
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(img,kernel,iterations = 1)
cv2.imshow('src',img)
cv2.imshow('show',dilation )
cv2.waitKey(0)
开操作 先腐蚀再膨胀
import cv2
import numpy as np
o=cv2.imread("11.jpg",cv2.IMREAD_UNCHANGED)
k=np.ones((5,5),np.uint8)
cv2.namedWindow('src-img', 0)
cv2.resizeWindow('src-img', 300, 300)
cv2.imshow('src-img', o)
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
# retval, dst = cv2.threshold(gray, 110, 255, cv2.THRESH_BINARY)
# 最大类间方差法(大津算法),thresh会被忽略,自动计算一个阈值
retval, o = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
r=cv2.dilate(o,k,iterations=1)
r1=cv2.erode(o,k,iterations=1)
open_img=cv2.dilate(r1,k,iterations=1)
cv2.namedWindow('open-img', 0)
cv2.resizeWindow('open-img', 300, 300)
cv2.imshow('open-img', open_img)
cv2.waitKey(0)
闭操作 先膨胀再腐蚀
import cv2
import numpy as np
o=cv2.imread("11.jpg",cv2.IMREAD_UNCHANGED)
k=np.ones((5,5),np.uint8)
cv2.namedWindow('src-img', 0)
cv2.resizeWindow('src-img', 450, 300)
cv2.imshow('src-img', o)
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
# retval, dst = cv2.threshold(gray, 110, 255, cv2.THRESH_BINARY)
# 最大类间方差法(大津算法),thresh会被忽略,自动计算一个阈值
retval, o = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
r=cv2.dilate(o,k,iterations=1)
r1=cv2.erode(o,k,iterations=1)
close_img=cv2.erode(r,k,iterations=1)
cv2.namedWindow('close-img', 0)
cv2.resizeWindow('close-img', 450, 300)
cv2.imshow('close-img', close_img)
cv2.waitKey(0)
或者直接调用
import cv2
import numpy as np
def open_demo(image):#开操作=腐蚀+膨胀 去外边白点
print(image.shape)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow("binary", binary)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
cv2.imshow("open-result", binary)
def close_demo(image):#闭操作=膨胀+腐蚀 填充里边黑点
print(image.shape)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow("binary", binary)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15))
binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
cv2.imshow("close_demo", binary)
src = cv2.imread("11.jpg")
cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("input image", src)
open_demo(src)
close_demo(src)
cv2.waitKey(0)