上篇已经对opencv有了一些简单的介绍,下面将介绍一下opencv更多实用的操作。
一、opencv具体使用
1、图片打码
# 图片打码
a = cv2.imread(r'./timg98.jpg')
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩阵赋值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
2、图片组合
# 图片组合
a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b[200:350,200:350] = a[50:200,100:250]#注意:矩阵的大小必须要统一。
cv2.imshow('b',b)
cv2.imshow('a',a)
cv2.waitKey(100000)
cv2.destroyAllWindows()
3、图片压缩
# 图片缩放cv2.resize
# 用于调整图像的大小。它有以下几个参数:
# src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。
# dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像。
# fx:沿x轴的缩放系数。
# fy:沿y轴的缩放系数。
a = cv2.imread('timg98.jpg')
a_new = cv2.resize(a,(200,600)) # 宽、高
# a_new = cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
# print(a.shape) # 高、宽、通道数
cv2.imshow('a',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()
二、opencv进阶功能
1、边界填充
import cv2
xxal = cv2.imread('xxal.jpg')
xxal=cv2.resize(xxal,dsize=None,fx=0.5,fy=0.5) # 图片缩放
# ys=cv2.resize(xxal,(640,480))
top,bottom,left,right = 50,50,50,50
constant = cv2.copyMakeBorder(xxal,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(229,25,80))
reflect = cv2.copyMakeBorder(xxal,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(xxal,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(xxal,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(xxal,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
cv2.imshow('yuantu', xxal)
cv2.waitKey(0)
cv2.imshow('CONSTANT', constant)
cv2.waitKey(0)
cv2.imshow('REFLECT', reflect)
cv2.waitKey(0)
cv2.imshow('REFLECT_101', reflect101)
cv2.waitKey(0)
cv2.imshow('REPLICATE', replicate)
cv2.waitKey(0)
cv2.imshow('WRAP', wrap)
cv2.waitKey(0)
运行结果如下
2、阈值处理
import cv2
image = cv2.imread('xxal.jpg')#灰度图
image_new = cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
ret, binary = cv2.threshold(image_new, 175, 225, cv2.THRESH_BINARY)
ret1, binaryinv = cv2.threshold(image_new, 175, 225, cv2.THRESH_BINARY_INV)
ret2, trunc = cv2.threshold(image_new, 175, 225, cv2.THRESH_TRUNC)
ret3, tozero = cv2.threshold(image_new, 175, 225, cv2.THRESH_TOZERO)
ret4, tozeroinv = cv2.threshold(image_new, 175, 225, cv2.THRESH_TOZERO_INV)
cv2.imshow('image_new',image_new)#原灰度图
cv2.waitKey(0)
cv2.imshow('binary',binary)#
cv2.waitKey(0)
cv2.imshow('binaryinv',binaryinv)
cv2.waitKey(0)
cv2.imshow('trunc',trunc)
cv2.waitKey(0)
cv2.imshow('tozero',tozero)
cv2.waitKey(0)
cv2.imshow('tozeroinv',tozeroinv)
cv2.waitKey(0)
运行结果如下
3、图像平滑处理
import cv2
import numpy as np
def add_peppersalt_noise(image_new, n=10000):
result = image_new.copy()
h, w = image_new.shape[:2]#获取图片的高和宽
for i in range(n):#生成n个椒盐噪声
x = np.random.randint(1,h)
y = np.random.randint(1, w)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x, y] = 255
return result
image = cv2.imread('xxal.jpg')
image_new = cv2.resize(image,dsize=None,fx=0.5,fy=0.5)
cv2.imshow('yntu',image_new)
cv2.waitKey(0)
noise = add_peppersalt_noise(image_new)
cv2.imshow('noise', noise)
cv2.waitKey(0)
#均值滤波 blur
blur_1 = cv2.blur(noise, (3,3))#卷积核为3,3 效果一般,清晰度一般
cv2.imshow('blur_1', blur_1 )
cv2.waitKey(0)
blur_2 = cv2.blur(noise, (5,5))#卷积核为5,5 效果好但模糊
cv2.imshow('blur_2', blur_2 )
cv2.waitKey(0)
# cv2.destroyAllWindows()
boxFilter_1 = cv2.boxFilter(noise, -1,(3,3),normalize = True)
cv2.imshow('boxFilter_1 ',boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise, -1,(3,3),normalize = False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)
GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow('GaussianBlur',GaussianB)
cv2.waitKey(0)
medianB = cv2.medianBlur(noise, 3)
cv2.imshow('medianBlur',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下
4、图像腐蚀与膨胀
#1、图像腐蚀
import cv2
import numpy as np
sun = cv2.imread('sun.png')
cv2.imshow('src',sun)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)#设置kernel大小,和改为5*5试试
erosion_1 = cv2.erode(sun, kernel,iterations=2)#interations改为5试试
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)
#2、图像膨胀
wenzi = cv2.imread('wenzi.png')
cv2.imshow('src1',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)#设置kernel大小
wenzi_new = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('wenzi_new',wenzi_new)
cv2.waitKey(0)
输出结果
腐蚀操作:将图像中的白色区域缩小,通常用于去除小的白色噪声点。
膨胀操作:将图像中的白色区域扩大,通常用于填补小的黑色孔洞。
三、总结
本文通过一系列代码示例,详细介绍了 OpenCV 中的边界填充、阈值处理、平滑处理和形态学操作。这些技术在图像预处理、特征提取和图像增强中具有广泛的应用。通过掌握这些基本的图像处理方法,我们可以更好地理解和应用更高级的计算机视觉算法。
如果你对图像处理感兴趣,或者想了解更多关于 OpenCV 的知识,欢迎你的关注!