计算机视觉基本操作(python+opencv)

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)


猜你喜欢

转载自blog.csdn.net/m0_53112875/article/details/125111843
今日推荐