OpenCV入门笔记(三) 图片处理

OpenCV中提供了很多处理图片的强大函数,可以对很多格式的图片加特效!有点实现Photoshop里的工具的感觉。 下面先介绍一些简单和常见的特效。


二值化(Image Threshold)

参考这里:Image Processing

二值化只能处理灰度图,而所谓的灰度图,就是一幅只用 0-255 这个范围来表示每一个像素点的图像。灰度图没有色彩信息,看起来灰萌灰萌哒;但是又不完全只有黑白两种颜色。

二值化,顾名思义,就是把灰度图的0-255的范围,映射到 0 和 1 两个值上。最简单的做法,便是先设置一个阈值(threshold),比如叫 t 好了。当灰度图完成了的像素值 g < t,则赋值为 1,否则为 0. 这样就完成了二值化。

二值化的效果,是能够将物体和背景分割出来,原理是让物体和背景的像素间方差最大。


Threshold函数

简单的全局二值化函数,用法如下

ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINAEY)


参数

  • img 是要二值化的图片
  • 127 表示阈值,这里我们用中位数表示。
  • 255 表示大于阈值,便给该像素赋这个值。
  • cv2.THRESH_BINARY 表示要用的二值化方法,取值如下
    • cv2.THRESH_BINARY
    • cv2.THRESH_BINARY_INV
    • cv2.THRESH_TRUNC
    • cv2.THRESH_TOZERO
    • cv2.THRESH_TOZERO_INV


返回值

  • ret 貌似会返回127,不知道有什么用
  • thresh 二值化以后的图片

AdaptiveThreshold函数

前面的全局二值化函数,用的阈值只有一个,但是这样往往效果不是很好,所以有了自适应的局部二值化算法。

adaptive = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)


参数

  • img 要处理的灰度图
  • 255 大于阈值后要赋的值
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C 要用的自适应二值化方法
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C 高斯法
    • cv2.ADAPTIVE_THRESH_MEAN_C 平均法
  • cv2.THRESH_BINARY 表示阈值类型,只能取下面两种
    • cv2.THRESH_BINARY
    • cv2.THRESH_BINARY_INV
  • 11 是blocksize,奇数
  • 2 常数C,用于从平均值或带权重的平均值中减去这个值


返回值

  • adaptive 返回二值化后的图片

图片模糊和图片平滑(Image Blur && Image Smoothing)

在图片的自适应局部二值化之前,一般先要进行图片的平滑处理,以过滤掉那些噪点。原理是让待处理图片和一个低通滤波器的(low-pass filter kernel),其实就是一个矩阵,做卷积运算。

中文官方解释见这里:图像平滑

举个栗子

img = cv2.imread(‘./lena.jpg‘)

# 模糊函数
blur = cv2.blur(img, (5, 5))

# 高斯模糊,(5,5)是Kernel的大小
gBlur = cv2.GaussianBlur(img, (5, 5), 0)

# 中值模糊
mBlur = cv2.medianBlur(img, 5) 

# 双边模糊
bBlur = cv2.bilateralFilter(img, 9, 75, 75)

一般我们用高斯平滑就够了。


滑动条

一般我们用一些OpenCV中的函数,经常要动态地调一个参数,有了滑动条就会方便很多,直接拖动就改变相应的参数,就像手机上放大音量那样简单。

比起前面,滑动条的响应函数要自己定义。

def refresh(x):
    print x

cv2.createTrackbar("value: ", "window title", 0, 255, refresh)

参数

  • “value: ” 滑动条上的显示字符串
  • “window title”,要显示在的窗口名
  • 0 默认值
  • 255 最大值
  • 响应函数名

注意,这里的refresh函数中,变量x是必须的,否则取不了值


例子和完整代码

综合上面讲的函数,我们写一个完整的例子,依次展示:原图,灰度图,高斯平滑,二值化,自适应高斯二值化五张图片。

import cv2

title_ori = "binary"
title_ada = "adaptive"
title_trackbar = "threshold value"

# when value changed, refresh the picture
def refresh(x):
    ret, thres = cv2.threshold(blur, x, 255, cv2.THRESH_BINARY)
    cv2.imshow(title_ori, thres)

img = cv2.imread("./lena.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)

# create window
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.namedWindow("gray", cv2.WINDOW_NORMAL)
cv2.namedWindow("blur", cv2.WINDOW_NORMAL)

# show origin image, gray image and blur image
cv2.imshow("img", img)
cv2.imshow("gray", gray)
cv2.imshow("blur", blur)

# create window and trackbar for binary image
cv2.namedWindow(title_ori, cv2.WINDOW_NORMAL)
cv2.createTrackbar(title_trackbar, title_ori, 0, 255, refresh)
cv2.imshow(title_ori, img)

# create and show adaptive threshold
adaptive = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.namedWindow(title_ada, cv2.WINDOW_NORMAL)
cv2.imshow(title_ada, adaptive)

cv2.waitKey(0)
cv2.destroyAllWindows()

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 23:34:31

OpenCV入门笔记(三) 图片处理的相关文章

OpenCV入门笔记(二) 图片的文件操作

以下介绍一下重要的几个,设计基本 图片处理 的函数,依次来了解OpenCV的入门知识.具体的具体使用方法还是以官方的API[Official Tutorials][Python-OpenCV]为准. imread 图片读取函数.使用方法例如以下 # read image with color img = cv2.imread("./lena.jpg") # OR read gray image imgGray = cv2.imread("./lena.jpg", 0

OpenCV入门笔记(六) 形态学变换

形态学变换(Morphological Transformations),其实是数学上的一个分支,是基于形状的一些列图像处理操作.OpenCV提供了很多方便而有用的操作函数. 一.腐蚀和膨胀(erosion & dilation) 腐蚀(erosion)和膨胀(dilation)是形态学中两个最基本的操作.他们结合后又会衍生出其他很多种复杂的过程.其基本思想很简单,就是用一个核函数,扫过原图像,用覆盖的区域中最值代替锚点(锚点即核函数当前的中心点,即扫描的中心点).下面是苏东坡<水调歌头·明

OpenCV入门笔记(四) 形态学变换

形态学变换(Morphological Transformations),其实是数学上的一个分支,是基于形状的一系列图像处理操作.OpenCV提供了很多方便而有用的操作函数. 一.腐蚀和膨胀(erosion & dilation) 腐蚀和膨胀 是形态学中两个最基本的操作.他们结合后又会衍生出其他很多种复杂的过程.其基本思想很简单,就是用一个 核函数,扫过原图像,用覆盖的区域中最值代替锚点(核函数当前的中心点,即扫描的中心点).下面是苏东坡<水调歌头·明月几时有>的楷体图片,我们来看看腐

OpenCV入门笔记(一) Linux下的安装

关于OpenCV,有中文的官方网站,里面翻译了官网的教程和API等.中文官方Tutorials见这里:[Tutorials] 一.Ubuntu下的安装 可以选择直接从库里安装,或者手动编译安装,请参考这里:[Installation in Linux] 1. 从repository(库)中安装 sudo apt-get install libopencv-dev python-opencv 2. 手动编译安装 首先要解决OpenCV的依赖问题,直接在终端下执行 sudo apt-get inst

Opencv学习笔记(三)--图像处理的基本操作

Opencv图像处理基本操作 1基本数据类型 图像有若干个通道,灰度图像只有一个通道,而彩色具有红,绿,蓝组成,但是OpenCv以逆序的方式来存储三个分量,还可以使用第四个透明度(alpha),可以使用img.channels()获取图像通道个数. 使用若干个位存储一副图像的每个像素,这被称为图像的深度,灰度图像为8位,即0-255个灰度级,可以用img.depth()获得图像的深度,其返回值为: CV_8U - 8-bit unsigned integers ( 0..255 ) CV_8S

OpenCV入门笔记(六) 轮廓检测(Detect Contours)

轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线.检测轮廓的工作对形状分析和物体检测与识别都非常有用. 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测.在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点. cv2.findContours函数 Python版示例如下,也可以参考[OpenCV-Python教程(11.轮廓检测)][Contours : Getting Started] contours, hierar

OpenCV入门笔记(五) 边缘检测

这里介绍三种边缘检测的方法, Sobel算子(索贝尔算子), Laplacian算子(拉普拉斯算子) 和 Canny算子 的边缘检测. 一.Sobel算子 Sobel算子在一阶偏导上检测边缘,且能在水平(x 方向)和竖直(y 方向)分别作用.直观上,Sobel寻找这样的边缘:中间灰度值特别大,两边很小,即像素值出现跳跃的现象.我们可以通过求梯度值来确定. x 和 y 两个方向的核函数如下: ????1?2?1000+1+2+1???(Gx) ???+10?1+20?2+10?1???(Gy) 若

OpenCv学习笔记(三)---OpenCv中基本数据类型--Point,Size,Rect,Scalar,Vec3b类类型的详细解释及其OpenCv中源代码的详细分析

/********************************************************************************************* 程序功能: OpenCv的基本数据结构源代码的解读,我们常用的OpenCv的基本数据结构有六种: 1--Point类 2--Size类 3--Rect类 4--Scalar类 5--Vec3b--向量模板类 6--Range类 编写环境: OpenCv2.4.8+VS2010 地点时间: 陕西师范大学 201

Opencv 入门学习之图片人脸识别

读入图片,算法检测,画出矩形框 import cv2 from PIL import Image,ImageDraw import os def detectFaces(image_name): img = cv2.imread(image_name) face_cascade = cv2.CascadeClassifier('../opencv-2.4.9/data/haarcascades/haarcascade_frontalface_default.xml') if img.ndim==