因学习OpenCV需求,进行缩放、高斯模糊、Canny边缘提取测试。
系统:Windows7 x64
Python:2.7.14
PyCharm:2017.1.1
OpenCV:3.4.4
输入的图像存在大小不一定适配的问题,该函数通过设定宽、高阈值来进行等比例缩放。
输入
1)读入的图像;
2)宽阈值;
3)高阈值;
4)插值方法(可选)。
输出
满足宽、高阈值的图像。
示例
代码
def resizeImage(image, width, height, inter=cv2.INTER_AREA):
'''
图像缩放
:param image: 输入图像
:param width: 输出图像宽限制
:param height: 输出图像高限制
:param inter: 插值方法
CV_INTER_NN - 最近-邻居插补
CV_INTER_LINEAR - 双线性插值(默认方法)
CV_INTER_AREA - 像素面积相关重采样。当缩小图像时,该方法可以避免波纹的出现。当放大图像时,类似于方法CV_INTER_NN
CV_INTER_CUBIC - 双三次插值
:return:
'''
newsize = (width, height)
# 获取图像尺寸
(h, w) = image.shape[:2]
if w <= width and h <= height:
return image
# 高度算缩放比例
if w > width:
n = height / float(h)
newsize = (int(n * w), height)
else:
n = width / float(w)
newsize = (width, int(h * n))
# 缩放图像
newimage = cv2.resize(image, newsize, interpolation=inter)
return newimage
将图像进行高斯平滑,并通过二值处理后输出。
输入
1)图像(RGB)。
输出
1)高斯平滑后的二值图。
示例
代码
def gaussianBlur(filename):
'''
高斯平滑+二值图
:param
filename 文件名:
:param
type: 读取图片的方式
IMREAD_COLOR 彩色图像
IMREAD_GRAYSCALE 灰度图像
IMREAD_ANYCOLOR 任意图像
:return
Gauss_img 高斯平滑+二值图处理后的图片:
'''
gray_img = cv2.cvtColor(filename, cv2.COLOR_BGR2GRAY)
Gauss_img = cv2.GaussianBlur(gray_img, (5,5), 0, 0, cv2.BORDER_DEFAULT)
return Gauss_img
通过Canny边缘检测算法提取边缘,并输出处理后的图片
输入
1)图像(灰度图)。
输出
1)经过Canny边缘提取的图片。
示例
代码
def cannyFindBoundary(img):
'''
Canny边缘提取
:param img: 图片
:return: Canny Canny边缘提取后的图像
'''
Canny = cv2.Canny(img, 200, 300)
return Canny
暂停,直到按下任意键后,关闭所有窗口。
输入
1)任意按键。
输出
1)所有窗口都关闭。
代码
def wait():
cv2.waitKey()
cv2.destroyAllWindows()
# encoding: utf-8
'''
Author:MyoontyeeChen
Date:20181202
Python2.7 + OpenCV3.4 缩放、高斯模糊、Canny边缘提取
'''
import cv2
def resizeImage(image, width, height, inter=cv2.INTER_AREA):
'''
图像缩放
:param image: 输入图像
:param width: 输出图像宽限制
:param height: 输出图像高限制
:param inter: 插值方法
CV_INTER_NN - 最近-邻居插补
CV_INTER_LINEAR - 双线性插值(默认方法)
CV_INTER_AREA - 像素面积相关重采样。当缩小图像时,该方法可以避免波纹的出现。当放大图像时,类似于方法CV_INTER_NN
CV_INTER_CUBIC - 双三次插值
:return:
'''
newsize = (width, height)
# 获取图像尺寸
(h, w) = image.shape[:2]
if w <= width and h <= height:
return image
# 高度算缩放比例
if w > width:
n = height / float(h)
newsize = (int(n * w), height)
else:
n = width / float(w)
newsize = (width, int(h * n))
# 缩放图像
newimage = cv2.resize(image, newsize, interpolation=inter)
return newimage
def gaussianBlur(filename):
'''
高斯平滑+二值图
:param
filename 文件名:
:param
type: 读取图片的方式
IMREAD_COLOR 彩色图像
IMREAD_GRAYSCALE 灰度图像
IMREAD_ANYCOLOR 任意图像
:return
Gauss_img 高斯平滑+二值图处理后的图片:
'''
gray_img = cv2.cvtColor(filename, cv2.COLOR_BGR2GRAY)
Gauss_img = cv2.GaussianBlur(gray_img, (5,5), 0, 0, cv2.BORDER_DEFAULT)
return Gauss_img
def cannyFindBoundary(img):
'''
Canny边缘提取
:param img: 图片
:return: Canny Canny边缘提取后的图像
'''
Canny = cv2.Canny(img, 200, 300)
return Canny
def wait():
cv2.waitKey()
cv2.destroyAllWindows()
def main():
img = cv2.imread("i8.jpg",1)
img =resizeImage(img,300,300)
cv2.imshow("img", img)
Gauss_img = gaussianBlur(img)
cv2.imshow("Gauss_img",Gauss_img)
Canny = cannyFindBoundary(img)
cv2.imshow("Canny",Canny)
wait()
main()
调试如下代码
gray_img = cv2.cvtColor(filename, cv2.COLOR_BGR2GRAY)
可能出现如下问题
Traceback (most recent call last):
File "E:/PythonExe/OpenCV/Exe1.py", line 61, in
main()
File "E:/PythonExe/OpenCV/Exe1.py", line 55, in main
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(3.4.4) c:\projects\opencv-python\opencv\modules\imgproc\src\color.hpp:255: error: (-2:Unspecified error) in function '__thiscall cv::CvtHelper,struct cv::Set<1,-1,-1>,struct cv::Set<0,2,5>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
> Invalid number of channels in input image:
> 'VScn::contains(scn)'
> where
> 'scn' is 1
问题原因
在下述命令中,第二个参数“0”使得读入图片为灰度图
输入的图像是灰度图,不是RGB图
img = cv2.imread(filename, 0)
解决方法
按如下方式修改上述命令,其中filename需修改为要提取的图片文件名。
img = cv2.imread(filename, 1)
代码
[1]opencv3 图像处理 之 图像缩放( python与c++实现 )
[2]cvResize
[3]OpenCV3编程入门笔记(1)图像载入、显示、保存、变换灰度图
[4]opencv学习(十六)之颜色空间转换cvtColor()
图片
处理前图片为宝马i8图像,来自如下网址,如侵权请告知我,立马删除。
[1]宝马i8发布会