Python2.7 + OpenCV3.4 缩放、高斯模糊、Canny边缘提取

摘要

因学习OpenCV需求,进行缩放、高斯模糊、Canny边缘提取测试。

配置

系统:Windows7 x64
Python:2.7.14
PyCharm:2017.1.1
OpenCV:3.4.4

函数

图像缩放

输入的图像存在大小不一定适配的问题,该函数通过设定宽、高阈值来进行等比例缩放。
输入
1)读入的图像;
2)宽阈值;
3)高阈值;
4)插值方法(可选)。
输出
满足宽、高阈值的图像。
示例
Python2.7 + OpenCV3.4 缩放、高斯模糊、Canny边缘提取_第1张图片

代码

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)高斯平滑后的二值图。
示例
Python2.7 + OpenCV3.4 缩放、高斯模糊、Canny边缘提取_第2张图片

代码

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边缘提取

通过Canny边缘检测算法提取边缘,并输出处理后的图片
输入
1)图像(灰度图)。
输出
1)经过Canny边缘提取的图片。
示例
Python2.7 + OpenCV3.4 缩放、高斯模糊、Canny边缘提取_第3张图片

代码

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发布会

你可能感兴趣的:(OpenCV)