[OpenCV 体験概要] - 画像の前処理


序文

この記事は、私が OpenCV を使用中にまとめたいくつかの機能体験や写真のバグ対応体験をまとめたもので、その後の使用状況に応じて徐々に更新されます。


1. 画像の読み書き

import cv2

# 读取图片
img = cv2.imread(filename='./input.jpg', flag=1)
'''
filename:打开的图像文件路径名
flag:打开方式,一般默认彩色图片,可以不写。支持以下参数:
	  cv2.IMREAD_COLOR			加载彩色图片,这个是默认参数,可以直接写1。
	  cv2.IMREAD_GRAYSCALE		以灰度模式加载图片,可以直接写0。
	  cv2.IMREAD_UNCHANGED		包括alpha(包括透明度通道),可以直接写-1
'''

# 展示图片
cv2.imshow(winname='img_show', img=img)
cv2.waitKey(delay=0)	# 没有该函数会无法看到展示图片
'''
delay:表示延迟时间。不设置或设为0表示直到用户按任意键才会继续,大于0的数字表示等待时间(ms)。
'''

# 保存图片
cv2.imwrite(filename='./output.jpg', img=img, paras=[cv2.CV_IMWRITE_JPEG_QUALITY, 95])
'''
filename:保存的文件路径名
img:要保存的图像数据
paras:可选参数,图片的编码参数,支持以下参数:
	   cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
	   cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
	   cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。
返回值:函数可返回bool类型返回值,表示是否保存成功。
'''

2. サイズ変更とパディング

import cv2

# 读取图片
img = cv2.imread(filename='./input.jpg', flag=1)

# 调整图片大小
img_resize = cv2.resize(src=img,
						dsize=(512, 512),
						dst=None,
						fx=None,
						fy=None,
						interpolation=cv2.INTER_LINEAR)
'''
src:输入图片
dsize:输出图片尺寸,dsize和(fx,fy)选一赋值即可
dst:输出图片,也可以作为返回值输出
fx:水平轴缩放比例因子
fy:垂直轴缩放比例因子
interpolation:插值类型,可选以下参数:
			   cv2.INTER_LINEAR		双线性插值(默认)
			   cv2.INTER_NEAREST	最近邻插值
			   cv2.INTER_AREA		使用像素区域关系进行重采样
			   cv2.INTER_CUBIC		4x4像素领域的双三次插值
			   cv2.INTER_LANCZOS4	4x4像素领域的Lanczos插值
'''

# 填充图片
img_pad = cv2.copyMakeBorder(src=img_resize, 
							 top=10, 
							 bottom=10, 
							 left=10, 
							 right=10, 
							 borderType=cv2.BORDER_CONSTANT, 
							 dst=None, 
							 value=(0, 0, 0))
'''
src:输入图片
top:图片上方填充大小
bottom:图片下方填充大小
left:图片左侧填充大小
right:图片右侧填充大小
boarderType:填充方式,支持以下参数:
			 cv2.BORDER_CONSTANT	常数填充,需要value值
			 cv2.BORDER_REFLECT		边界元素镜像填充
			 cv2.BORDER_DEFAULT		类似上面的边界元素镜像填充,略有改动
			 cv2.BORDER_REPLICATE	重复边界元素填充
			 cv2.BORDER_WRAP		镜像互换填充,类似图片平铺
dst:输出图片,也可以作为返回值输出
value:填充值,尽在borderType=cv2.BORDER_CONSTANT时需要。
'''

# 展示图片
cv2.imshow(winname='img_resize', img=img_resize)
cv2.imshow(winname='img_pad', img=img_pad)
cv2.waitKey(delay=0)

3. フィルタリング

import cv2

# 读取图片
img = cv2.imread(filename='./input.jpg', flag=1)

# 均值滤波
img_blur = cv2.blur(src=img, 
					ksize=(3, 3), 
					dst=None, 
					anchor=None, 
					borderType=None)
'''
src:输入图片
ksize:卷积核大小(元组)
dst:输出图片,也可以作为返回值输出
anchor:锚点,默认值 Point(-1,-1) 表示锚点位于内核中央
borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT
'''

# 方盒滤波
img_box = boxFilter(src=img, 
					ddepth=-1, 
					ksize=(5, 5), 
					dst=None, 
					anchor=None, 
					normalize=None, 
					borderType=None)
'''
src:输入图片
ddepth:输出图像深度,默认为-1,即和原图相同
ksize:卷积核大小(元组)
dst:输出图片,也可以作为返回值输出
anchor:锚点,默认值 Point(-1,-1) 表示锚点位于核中央
normalize:是否进行核区域归一化,bool类型
borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT
'''

# 高斯滤波,去除高斯噪声
img_gaussian = cv2.Gaussianblur(src=img,
								ksize=(5, 5),
								sigmaX=None,
								dst=None,
								sigmaY=None,
								borderType=None)
'''
src:输入图片
ksize:卷积核大小(元组)
sigmaX:在水平轴上的标准差σ
dst:输出图片,也可以作为返回值输出
sigmaY:在垂直轴上的标准差σ
borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT
'''

# 中值滤波,去除椒盐噪声和斑点噪声
img_median = cv2.medianBlur(src=img,
							ksize=5,
							dst=None)
'''
src:输入图片
ksize:卷积核大小(int)
dst:输出图片,也可以作为返回值输出
'''		

# 双边滤波
img_bilateral = cv2.bilateralFilter(src=img,
									d=3,
									sigmaColor=None,
									sigmaSpace=None,
									dst=None,
									borderType=None)		
'''
src:输入图片
d:像素的领域直径
sigmaColor:灰度值相似性高斯函数标准差σ
sigmaSpace:空间高斯函数标准差σ
dst:输出图片,也可以作为返回值输出
borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT
'''			

# 展示图片
cv2.imshow(winname='img_blur', img=img_blur)
cv2.imshow(winname='img_box', img=img_box)
cv2.imshow(winname='img_gaussian', img=img_gaussian)
cv2.imshow(winname='img_median', img=img_median)
cv2.imshow(winname='img_bilateral', img=img_bilateral)
cv2.waitKey(delay=0)
											

4. エッジ抽出

import cv2

# 读取图片
img = cv2.imread(filename='./input.jpg', flag=1)

# Canny 算子
img_canny = cv2.Canny(src=img, 
					  thresh1=50, 
					  thresh2=200) 
'''
src:输入图片
thresh1:最小阈值
thresh2:最大阈值
'''

# Sobel 算子
img_sobel = cv2.Sobel(src=img,
					  ddepth=-1,
					  dx=1,
					  dy=0,
					  ksize=3,
					  scale=1,
					  delta=0,
					  borderType=None)
'''
src:输入图片
ddepth:输出图像深度,默认为-1,即和原图相同
dx:在水平轴上的求导阶数
dy:在垂直轴上的求导阶数
ksize:卷积核大小(int),必须为奇数。-1表示使用Scharr算子
scale:梯度计算数值的放大系数,默认为1
delta:计算结果都加上delta,默认为0
borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT
'''

# Laplacian 算子
img_laplacian = cv2.Laplacian(src=img,
							  ddepth=-1,
							  ksize=3,
							  scale=1,
							  delta=0,
							  borderType=None)
'''
src:输入图片
ddepth:输出图像深度,默认为-1,即和原图相同
ksize:卷积核大小(int),必须为奇数。-1表示使用Scharr算子
scale:梯度计算数值的放大系数,默认为1
delta:计算结果都加上delta,默认为0
borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT
'''

# 展示图片
cv2.imshow(winname='img_canny', img=img_canny)
cv2.imshow(winname='img_sobel', img=img_sobel)
cv2.imshow(winname='img_laplacian', img=img_laplacian)
cv2.waitKey(delay=0)

5. 浸食と拡張、開閉操作

import cv2

# 读取图片
img = cv2.imread(filename='./input.jpg', flag=1)

# 腐蚀操作
img_erode = cv2.erode(src=img, 
					  kernel=cv2.getStructuringElement(cv2.MORPH_RECT, (1,3)), 
					  anchor=None, 
					  iterations=1, 
					  borderType=None, 
					  borderValue=None)
'''
src:输入图片
kernel:腐蚀所采用的结构类型,可使用cv2.getStructuringElement()生成,也可自定义numpy数组
anchor:锚点,默认值 Point(-1,-1) 表示锚点位于核中央
iterations:迭代次数,默认为1
borderType:计算图像外部像素的边界填充模式,参数类似上述填充的borderType参数,默认cv2.BORDER_DEFAULT
borderValue:填充值
'''

'''
cv2.getStructuringElement(shape, ksize)
shape:结构类型,支持以下参数:
	   cv2. MORPH_RECT		矩形结构元素,所有元素值都是1
	   cv2. MORPH_CROSS		十字形结构元素,对角线元素值都是1
	   cv2. MORPH_ELLIPSE	椭圆形结构元素
ksize:卷积核大小(元组)
'''
# 膨胀操作
img_dilate = cv2.dilate(src=img_erode, 
					  kernel=cv2.getStructuringElement(cv2.MORPH_RECT, (1,3)), 
					  anchor=None, 
					  iterations=1, 
					  borderType=None, 
					  borderValue=None)
'''
参数含义与erode相同
'''

'''
开运算:先腐蚀再膨胀,去除白噪点
闭运算:先膨胀再腐蚀,去除黑噪点
也可使用cv2.morphologyEx函数实现

cv2.morphologyEx(src, 
				 op, 
				 kernel)
src:输入图片
op:操作方式,支持以下参数:
	cv2.MORPH_OPEN		开运算(open) ,先腐蚀后膨胀的过程。开运算可以用来消除小黑点,在纤细点处分离物体、平滑较大物体的边界的 同时并不明显改变其面积。
	cv2.MORPH_CLOSE		闭运算(close),先膨胀后腐蚀的过程。闭运算可以用来排除小黑洞。
	cv2.MORPH_GRADIENT	形态学梯度(morph-grad),可以突出团块(blob)的边缘,保留物体的边缘轮廓。
	cv2.MORPH_TOPHAT	顶帽(top-hat),将突出比原轮廓亮的部分。
	cv2.MORPH_BLACKHAT	黑帽(black-hat),将突出比原轮廓暗的部分。
kernel:腐蚀所采用的结构类型,可使用cv2.getStructuringElement()生成,也可自定义numpy数组
'''

# 展示图片
cv2.imshow(winname='img_erode', img=img_erode)
cv2.imshow(winname='img_dilate', img=img_dilate)
cv2.waitKey(delay=0)

おすすめ

転載: blog.csdn.net/lucifer479/article/details/125906158