Python图像处理(4):滤波器

快乐虾

http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651)

欢迎转载,但请保留作者信息

滤波器在图像处理中的应用非常广泛,OpenCV也有个直接使用滤波器掩码(核)的函数filter2D,将图像与核进行卷积运算得到目标图像。卷积是在每一个图像块与某个算子(核)之间进行的运算,而核就是一个固定大小的数值数组。

实际上,在OpenCV中很多算法都是用卷积实现的,包括一些边缘检测的算法。本文无意列举这些算法的原理,仅仅是考察一下OpenCV的实现,再尝试用Python调用这些算法,看看其效果。

采用的测试图像还是它:

因为我们的最终目标是识别此图像中的杂草与棉花植株!

1.    FilterEngine

在OpenCV中滤波的操作由FilterEngine这个类来完成,在源码的注释里清楚地说明了这个类的作用:

The Main Class for Image Filtering.

 The class can be used to apply an arbitrary filtering operation to an image.
 It contains all the necessary intermediate buffers, it computes extrapolated values
 of the "virtual" pixels outside of the image etc.
 Pointers to the initialized cv::FilterEngine instances
 are returned by various OpenCV functions, such as cv::createSeparableLinearFilter(),
 cv::createLinearFilter(), cv::createGaussianFilter(), cv::createDerivFilter(),
 cv::createBoxFilter() and cv::createMorphologyFilter().

 Using the class you can process large images by parts and build complex pipelines
 that include filtering as some of the stages. If all you need is to apply some pre-defined
 filtering operation, you may use cv::filter2D(), cv::erode(), cv::dilate() etc.
 functions that create FilterEngine internally.

下面是FilterEngine的一个典型使用方式:

void cv::sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
                      InputArray _kernelX, InputArray _kernelY, Point anchor,
                      double delta, int borderType )
{
    Mat src = _src.getMat(), kernelX = _kernelX.getMat(), kernelY = _kernelY.getMat();

    if( ddepth < 0 )
        ddepth = src.depth();

    _dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) );
    Mat dst = _dst.getMat();

    Ptr<FilterEngine> f = createSeparableLinearFilter(src.type(),
        dst.type(), kernelX, kernelY, anchor, delta, borderType & ~BORDER_ISOLATED );
    f->apply(src, dst, Rect(0,0,-1,-1), Point(), (borderType & BORDER_ISOLATED) != 0 );
}

当然,如注释所说,我们几乎不需要直接使用这个类,但是了解它的用法对于我们理解和调试OpenCV是很有好处的。

2.    filter2D

下面试试直接给一个滤波器的矩阵看看效果。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# filter2D

src = cv2.imread(‘f:\\tmp\\cotton.jpg‘)
cv2.imshow(‘src‘, src)

kernel = np.array([ [-1, -1, -1],
                    [-1,  8, -1],
                    [-1, -1, -1] ])

dst = cv2.filter2D(src, -1, kernel)
cv2.imshow(‘dst‘, dst)

cv2.waitKey()

结果就是这样的:

3.    从Python到C++

看看从Python的filter2D到FilterEngine的执行过程。

首先是filter2D的wrapper函数:

static PyObject* pyopencv_filter2D(PyObject* , PyObject* args, PyObject* kw)
{
    PyObject* pyobj_src = NULL;
    Mat src;
    PyObject* pyobj_dst = NULL;
    Mat dst;
    int ddepth=0;
    PyObject* pyobj_kernel = NULL;
    Mat kernel;
    PyObject* pyobj_anchor = NULL;
    Point anchor=Point(-1,-1);
    double delta=0;
    int borderType=BORDER_DEFAULT;

    const char* keywords[] = { "src", "ddepth", "kernel", "dst", "anchor", "delta", "borderType", NULL };
    if( PyArg_ParseTupleAndKeywords(args, kw, "OiO|OOdi:filter2D", (char**)keywords, &pyobj_src, &ddepth, &pyobj_kernel, &pyobj_dst, &pyobj_anchor, &delta, &borderType) &&
        pyopencv_to(pyobj_src, src, ArgInfo("src", 0)) &&
        pyopencv_to(pyobj_dst, dst, ArgInfo("dst", 1)) &&
        pyopencv_to(pyobj_kernel, kernel, ArgInfo("kernel", 0)) &&
        pyopencv_to(pyobj_anchor, anchor, ArgInfo("anchor", 0)) )
    {
        ERRWRAP2( cv::filter2D(src, dst, ddepth, kernel, anchor, delta, borderType));
        return pyopencv_from(dst);
    }

    return NULL;
}

这个函数是swig自动生成的,简单地对filter2D这个C++函数进行了包装,处理了输入参数和返回值。接着看cv::filter2D的实现过程:

void cv::filter2D( InputArray _src, OutputArray _dst, int ddepth,
                   InputArray _kernel, Point anchor,
                   double delta, int borderType )
{
    Mat src = _src.getMat(), kernel = _kernel.getMat();

.....

    Ptr<FilterEngine> f = createLinearFilter(src.type(), dst.type(), kernel,
                                             anchor, delta, borderType & ~BORDER_ISOLATED );
    f->apply(src, dst, Rect(0,0,-1,-1), Point(), (borderType & BORDER_ISOLATED) != 0 );
}

和前面提到的sepFilter2D函数非常的相似!

cv::filter2D也是OpenCV开放的一个C++接口。

??

时间: 2024-11-10 00:11:27

Python图像处理(4):滤波器的相关文章

Python图像处理类库

本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像.图像转换和缩放.计算导数.画图和保存结果等的基本工具.这些工具的使用将贯穿本书的剩余章节. 1.1 PIL:Python图像处理类库 PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放.裁剪.旋转.颜色转换等.PIL 是免费的,可以从 http://www.pythonware.com/pr

Python图像处理库PIL中图像格式转换(一)

在数字图像处理中,针对不同的图像格式有其特定的处理算法.所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现.本文基于这个需求,使用python中的图像处理库PIL来实现不同图像格式的转换. 对于彩色图像,不管其图像格式是PNG,还是BMP,或者JPG,在PIL中,使用Image模块的open()函数打开后,返回的图像对象的模式都是"RGB".而对于灰度图像,不管其图像格式是PNG,还是BMP,或者JPG,打开后,其模式为"L". 通

Python图像处理库(1)

转自:http://www.ituring.com.cn/tupubarticle/2024 第 1 章 基本的图像操作和处理 本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像.图像转换和缩放.计算导数.画图和保存结果等的基本工具.这些工具的使用将贯穿本书的剩余章节. 1.1 PIL:Python图像处理类库 PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图

Python_Imaging_Library中文手册、PIL中文手册、python图像处理

Python Imaging Library 中文手册 这是PIL的官方手册,2005年5月6日发布.这个版本涵盖 PIL 1.1.5的全部内容.本中文手册来自Woodpecker.org.cn 啄木鸟社区 你可以在PythonWare library找到改文档其它格式的版本以及先前的版本. 原版出处:http://www.pythonware.com/library/pil/handbook/ 目录 Python Imaging Library 中文手册 第一部分:介绍 概览 介绍 图像归档处

Python图像处理(16):图像金字塔

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 图像金字塔是图像中多尺度表达的一种,最初用于机器视觉和图像压缩.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.其通过梯次向下采样获得,直到达到某个终止条件才停止采样.金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似.层级越高,则图像越小,分辨率越低. 一般情况下有两种类型的图像金字塔常常出现在文献和以及实际运用中.他们分别是: 高斯金字塔

Python图像处理(1):替换OpenCV

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 先前构造图像处理开发环境的时候,用一个别人编译好的安装包将OpenCV安装到了c:\python27\lib\site-packages目录下,但这个OpenCV没有符号表,无法进行C/C++的代码调试.我们用VS编译的OpenCV替换它. 首先修改OpenCV的Python接口工程,将其输出到python的库目录下,

Python图像处理库PIL的ImageOps模块介绍

(Newin 1.1.3)ImageOps模块包含了一些"ready-made"的图像处理操作.这个模块somewhatexperimental,大多数操作只工作在L和RGB图像上. 一.ImageOps模块的函数 1.  Autocontrast 定义:ImageOps.autocontrast(image, cutoff=0)? image 含义:最大图像对比度.这个函数计算一个输入图像的直方图,从这个直方图中去除最亮和最暗的百分之cutoff,然后重新映射图像,以便保留的最暗像素

Python图像处理(17):pyWavelet

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 下面试试用python完成小波相关的运算,这个过程可以通过pyWavelet这个库来完成. pyWavelet的主要特点: - 1D,2D正反离散小波变换(DWT,IDWT) - 1D,2d稳态小波变换(SWT,StationaryWavelet Transform) - 1D,2D小波包分解重构 - 逼近小波函数和尺度函数 - 70多个内置小波滤波器,支持定制小波 - 单双精度支持 - 类似M

Python图像处理库(PIL)

Python Imaging Library为您的python程序添加图像处理能力.这个库提供广泛的文件格式支持.高效的内部表示和相当强大的图像处理能力. 核心图像库是为快速访问几种基本像素格式图像设计的.它能为一般的图像处理工具提供一个可靠的基础. 这个Pythonic library可以 装载和保存多种格式文件 Loading and Saving images (diverse formats)  Python Imaging Library的最新版本可以识别并读取多数图像格式.写图像操作