• 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_BINARY)

    參数

    • 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 返回二值化后的图片

    模糊和平滑(Blur & Smoothing)

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

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

    所谓滤波。就是过滤掉信号中,高频或者低频,或者中间(即带通滤波)的部分。而低通的效果是 模糊,高通的效果是 锐化

    CSDN博主【浅墨】的这篇文章讲的非常好,事实上。整个将OpenCV的系列都非常深入浅出,适合刚開始学习的人。他也出了本书。有空能够关注一下。

    举个栗子

    img = cv2.imread('./lena.jpg')
    
    # 方框滤波
    boxBlur = cv2.boxblur(img, -1, (5, 5))
    
    # 均值滤波
    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)

    前面的方框滤波,均值滤波,高斯滤波,都是属于 线性滤波, 而中值滤波和双边滤波都是非线性的。非线性的滤波。效果一般好一点,可是也相对会速度较慢。

    对了,均值滤波事实上就是归一化的方框滤波,即

    blur = cv2.boxblur(img, -1, (5, 5), True)
    blur2 = blur(img, (5, 5))

    两行代码事实上是一样的。


    滑动条

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

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

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

    參数

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

    注意:
    1. 这里的refresh函数中。变量x是必须的,否则取不了值
    2. 创建滑动条。要在创建窗体代码的后面


    样例和完整代码

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

    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()
    
  • 相关阅读:
    数据库调优2
    数据库调优
    SQL优化
    支付宝/阿里面试题
    Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签 《转载》
    《转载》struts旅程《2》
    《转载》struts旅程《1》
    jsp 自定义标签
    body-content取值的意义
    jsp页面中jstl标签详解
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7250055.html
Copyright © 2020-2023  润新知