Opencv图像阈值之自适应阈值

美好的一个晚上,让我们来学习下Opencv图像阈值之自适应阈值吧!开车啦!

我们来回顾一下什么是简单阈值?

用一句话来说就是:

当图像像素值高于/低于阈值时做出什么情况的变化。

 

今天我们的自适应阈值是啥呢?

用一句话来说:

在图像内不同区域采用不同的阈值处理以得到更好的结果。

 

我们先来看一组效果图:

看下效果图先~

我来说一下具体的内容:

Original Image:这个是原图像;

Global Thresholding(v = 127):全局阈值化;

Adaptive Mean Thresholding:自适应均值阈值;

Adaptive Gaussian Thresholding:自适应高斯阈值。

 

-MDZZ,说的啥我一点都看不懂。说人话!

-按上边顺序,我说下大白话(●—●)

第一个:原图像就是你准备的那个图

第二个:设个阈值全图像都按简单阈值处理

(ps:简单阈值蒙圈的,回 去 看!附链接:

http://opencvblog.com/?p=385

第三个,第四个我也有点蒙圈

-这水平还出来教别人。。。

-我也是初学者,摸索着前进,数学不好伤不起,不过我会努力的!

 

我在这留下个记号:

到底第三第四个具体是什么意思。

 

下面我们来说一下具体的实现方法:

我们需要指定3个参数和一个返回值。

  • Adaptive Method(指定计算阈值的方法)

这个方法有两种:

               cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值;
               cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,
                                                                                                          权重为一个高斯窗口。
  • Block Size(邻域大小:用来计算阈值的区域大小)
  • C(是一个常数,阈值就等于平均值或者加权平均值减去这个常数,这个常数可以是负数。)

 

 

说实话,这一章还真是不好理解,既然难理解我们就要找到让它变得简单的办法。

我的办法就是多找几个图像试验下,

然后总结出到底哪种方法适合干什么。

 

我给出原图像:

dave.jpg原图像给大家

然后我们来试着写下代码:

老套路,

调用库,

读取图片,

我们的图片可能有噪声,需要进行一步处理:中值滤波,不懂不要担心,博主也不懂。(开个玩笑=。=,中值滤波简单来说就是去噪声,以后会接触到,我会详细的讲的~)

然后就是按3个参数来写方法,

其实我们说的返回值:就是三个参数一起得到一个返回值

(返回值到底是个啥?估计输出图像就是了吧。。。真是晕晕的LOL)

输出显示,

结束。

 

来上一下代码吧:

# -*- coding:utf-8 -*-
"""
Created on Thu Mar 2 20:24:06 2017

@author: Y

"""

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\haibaobaobao.jpg',0)

ret,th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11,2)

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

titles = ['Original Image', 'Global Thresholding(v = 127)', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']

images = [img, th1, th2, th3]

for i in xrange(4):
    plt.subplot(2, 2, i+1), plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
cv2.destroyAllWindows()

 

再来上几张不同的图像效果:

可爱的小企鹅~
BeHappy~

 

小海豹~

别忘了先把图像灰度处理,要不会出错的啊!(在调用的图像后加0,你们还记得吗?)

我的肉眼实在是看不出第三第四啥分别,以后遇到这个一定会补充出来。

而且会补充出具体的使用地方。

这些图像的原图像在原来的章中都出现过,去找吧勇士!

 

这一章有些蒙圈啊,不过随着知识的积累,自然而然会得心应手的,学习Opencv是个精细活,一定不要半途而废。今天的内容有些多了,大家好好领悟下。我是Y,时间就在手中一点点的流逝了,我所说的Opencv的深水会随时间一点点的出现的,勇士们!穿上泳衣,我们去游泳吧!晚安~