2019-11-01 09:50:24 qq_38161040 阅读数 157
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4121 人正在学习 去看看 贾志刚

python 常用的图像处理技术有两种方法,一种是 opencv,另一种是 pytesseract

opencv 进行图像处理的话,我们需要安装 opencv-pythonnumpy 这两个库,直接用 pip install 安装就好了。

numpy 的作用是:进行科学计算的基础软件包,我们后续处理会涉及到大量的科学计算,到时候就用到了。
下面先测一下能不能用。

import cv2

img = cv2.imread("xiaoai.jpg")   # 读取图片
cv2.imshow("xiaoai", img)   # 展示图片时窗口显示名称
cv2.waitKey(10000)   # 图像展示时间,单位:毫秒(ms)

运行效果图:
在这里插入图片描述
你可能发现了,上面的方式只能读取英文路径,中文路径会报错,这时为大家展示下numpy的用处,可以对中文路径的图片进行解码处理。

import cv2
import numpy as np

# img = cv2.imread("小爱.jpg")   # 直接读取中文会报错
img = cv2.imdecode(np.fromfile("小爱.jpg", dtype=np.uint8), 1)   # 可以读取中文路径图片
cv2.imshow("xiaoai", img)   # 展示图片时窗口显示名称
cv2.waitKey(10000)   # 图像展示时间,单位:毫秒(ms)

喜欢的点个赞❤吧!

2019-01-31 21:44:21 weixin_42823848 阅读数 58
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4121 人正在学习 去看看 贾志刚

opencv图像处理(Image Processing)

图像变化(image transformations)
1. 移动(translation)

M = np.float32([[1,0,25],[0,1,50]])
shifted = cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
cv2.imshow("shifted down and right",shifted)

首先定义移动矩阵 M,表示移动(left,right,up,down) 多少像素
矩阵M是浮点型的数组
[1, 0, x]:x表示左右移动多少像素,
x值为正——像右移动,x值为负——向左移动
[0, 1, y]:y表示上下移动多少像素
y值为正——向下移动,y值为负——向上移动

利用 cv2.warpAffine() 进行变换

完整代码

import numpy as np 
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required = True,
	help = "path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
cv2.imshow("original",image)

M = np.float32([[1,0,25],[0,1,50]])
shifted = cv2.warpAffine(image,M,(image.shape[1],image.shape[0]))
cv2.imshow("shifted down and right",shifted)
cv2.waitKey(0)

运行

python3 translation.py -i /路径/xxx.jpg

2. 旋转(rotation)

(h,w) = image.shape[:2]
center = (w // 2, h // 2)

M = cv2.getRotationMatrix2D(center,45,1.0)
rotated = cv2.warpAffine(image,M,(w,h))
cv2.imshow("rotated by 45 degree",rotated)

首先确定中心位置center
定义矩阵M:利用cv2.getRotationMatrix2D而不是利用numpy,
cv2.getRotationMatrix2()中的参数分别为旋转的固定点、旋转角度、1.0代表大小不变(当然你也可以改变)
接下来继续利用cv2.warpAffine()进行变换

完整代码

import numpy as np 
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required = True,
	help = "Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
cv2.imshow("original",image)

(h,w) = image.shape[:2]
center = (w // 2, h // 2)

M = cv2.getRotationMatrix2D(center,45,1.0)
rotated = cv2.warpAffine(image,M,(w,h))
cv2.imshow("rotated by 45 degree",rotated)
cv2.waitKey(0)

3. 改变大小(resizing)

r = 150.0 / image.shape[1]
dim = (150,int(image.shape[0]*r))

resized = cv2.resize(image,dim,interpolation = cv2.INTER_AREA)
cv2.imshow("REsized(Witdth)",resized)

假设定义新的图像的宽度(width)150像素,利用比例关系确定高度(height)
利用cv2.resize()变换,最后一个参数为变换的算法(当然还有其他的可以利用,比如cv2.INTER_LINEAR,cv2.INTER_CUBIC, cv2.INTER_NEAREST.)

r = 150.0 / image.shape[0]
dim = (int(image.shape[1]*r),50)

resized = cv2.resize(image,dim,interpolation = cv2.INTER_AREA)
cv2.imshow("REsized(Witdth)",resized)

定义高度进行变换

完整代码

import numpy as np 
import cv2
import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required = True,
	help = "Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Original",image)

r = 150.0 / image.shape[1]
dim = (150,int(image.shape[0]*r))

resized = cv2.resize(image,dim,interpolation = cv2.INTER_AREA)
cv2.imshow("REsized(Witdth)",resized)

r = 150.0 / image.shape[0]
dim = (int(image.shape[1]*r),50)

resized = cv2.resize(image,dim,interpolation = cv2.INTER_AREA)
cv2.imshow("REsized(Witdth)",resized)
cv2.waitKey(0)

4.翻转(flipping)

image = cv2.imread(args["image"])
cv2.imshow("Original",image)

flipped = cv2.flip(image,1)
cv2.imshow("flipped horizontally",flipped)

flipped = cv2.flip(image,0)
cv2.imshow("flipped vertiacally",flipped)

flipped = cv2.flip(image,-1)
cv2.imshow("flipped horizontally & vertiacally",flipped)

利用cv2.flip()即可

5. 剪裁(cropping)

cropped = image[30:120 ,240:335]
cv2.imshow("crop",cropped)

前一个参数为高度,后一个为宽度

完整代码

import numpy as np 
import argparse
import cv2

ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required = True,
	help = "Path to the image")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
cv2.imshow("Original",image)

cropped = image[30:120 ,240:335]
cv2.imshow("crop",cropped)
cv2.waitKey(0)
2018-07-28 11:09:47 smilejiasmile 阅读数 563
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4121 人正在学习 去看看 贾志刚


《OpenCV编程实例代码》各章重点知识点简述

第一章 OpenCv环境配置


  • 主要讲解了 OpenCV 的各种开发环境的配置,其中以Sublime 作为主要的配置环境的介绍,这里我们主要使用 VScode 进行开发。

第二章 图像及视频的基本操作


  • 图像基本类库 Mat 的基本操作
    • Mat 的基本操作:
      - Mat::row 、Mat::col 
        - Mat::rowRange 、Mat::colRange
        - Mat::clone 、Mat::copyTo
        - Mat::convertTo 
        - Mat::zeros 、Mat::ones
        - Mat::channels 
        - Mat::empty 、Mat::at

    • 图像的读取、显示、保存
    • 图像存储
    • 视频基本类库 VideoCapture 的基本操作
    • 常见函数:
     - VideoCapture::open
        - VideoCapture::isOpened 
        - VideoCapture::release 
        - VideoCapture::grab
        - VideoCapture::retrieve 解码并返回视频帧
        - VideoCapture::read
        - VideoCapture::get 返回指定视频的相关参数信息
        - VideoCapture::set

    • 视频写操作 VideoWrite
      • 常见函数
        • open 、write
    • 视频质量评价 :图像的相似度
      • 峰值信噪比 PSNR 用于图像压缩中的信号重建的测量方法
      • 结构相似性 SSIM
  • 图像的几何变换
    • 坐标映射 remap
    • 平移
    • 缩放
      • 等间隔提取图像缩放
      • 区域字块提取图像缩放
    • 旋转
      • 翻转 transpose 、filp
    • 仿射变换
      • 在空间坐标系中将一个二维坐标转换成另一个二维坐标
  • 图像的基本应用操作
    • 界面事件
      • 程序界面中的鼠标及键盘事件
      • 如:setMouseCallback(WinNameString,MouseCallBack,userData)
      • 其中回调函数形式为 void Fun(int event,int x,int y,int flags,void *param)
      • 其中,上面的 event 是 enum 的数值
     -  CV_EVENT_MOUSEMOVE      =0,
            -  CV_EVENT_LBUTTONDOWN    =1,
            -  CV_EVENT_RBUTTONDOWN    =2,
            -  CV_EVENT_MBUTTONDOWN    =3,
            -  CV_EVENT_LBUTTONUP      =4,  
            -  CV_EVENT_RBUTTONUP      =5,
            -  CV_EVENT_MBUTTONUP      =6,
            -  CV_EVENT_LBUTTONDBLCLK  =7,
            -  CV_EVENT_RBUTTONDBLCLK  =8,
            -  CV_EVENT_MBUTTONDBLCLK  =9,
            -  CV_EVENT_MOUSEWHEEL     =10,
            -  CV_EVENT_MOUSEHWHEEL    =11   

    • 区域提取,提取出你感兴趣的部分
      • 1、使用cv::Rect 选择 + copyTo 复制
      • 2、利用鼠标左右键标志位控制选择区域
    • 图像元素遍历 — 反色
      • 由于对于图像像素比较之多,于是遍历算法就有一定的好坏之分,这里介绍如下几种:
        • Mat 提供的函数模板 Mat::at
        • 指针遍历 Mat::ptr Mat 的函数模板
        • 使用 Mat 数据操作的迭代器MatIterator_
        • 使用 Mat 的isContinuous 判断是否连续存储,在讲图像看成一行,按行展开
        • LUT (Look Up Table)查表法,可以减少图像映射的时间复杂度(可用于替换、反转、赋值、阈值、二值化、灰度变化)
    • 单窗口显示多幅图像
    • 图像颜色空间转换 cvtColor
    • 图像批量读取
      • 文件名连续规则,可用 sptintf 函数
      • 文件名不规则,可用 VC 下 WIN32_FIND_DATA 文件的读取方式进行  

第二部分 图像处理技术

第三章 图像灰度变换技术


涉及到图像灰度变换技术、阈值化操作、直方图相关操作及其应用及 Gamma 校正、线性、对数及分段线性变换技术、灰度变换应用实例:最大熵阈值分割与投影峰谷查找

  • 阈值化处理
    • OTSU 阈值化
    • 固定阈值化 threshold
    • 自适应阈值化 adaptiveThreshold
    • 双阈值化
    • 半阈值化
  • 直方图处理
    • 灰度直方图
    • H-S 直方图
    • BGR 直方图
    • 自定义直方图
    • 灰度直方图均衡
    • 彩色直方图均衡
    • 直方图变换 — 查找
    • 直方图变换 — 累计
    • 直方图匹配
    • 直方图对比
      • 相关系数
      • 卡方系数
      • 相交系数
      • 巴氏系数
    • 直方图反向投影
  • 距离变换
    • 介绍 距离、邻接性、区域 的概念
    • 距离变换 — 扫描
    • 距离变换 — OpenCV 提供的 distanceTransform
  • Gamma 校正: 是一种非线性变换,对输入的图像灰度值进行指数变换,进而校正亮度偏差,常用于扩展暗调的细节。当Gamma校正的值大于 1 时,高光部分被压缩而暗调部分被扩展。小于 1 时,反之。
  • 常见的灰度变换技术
    • 线性变换
    • 对数变换
    • 对比度拉伸
    • 灰度级分层
    • 灰度比特平面
  • 实例应用
    • 最大熵阈值分割
    • 投影峰谷查找

第四章 图像平滑技术


涉及到图像采样常用操作:最近邻、双线性、及金字塔。傅里叶变换与卷积、图像典型噪声:椒盐和高斯、常用的空间滤波方式:均值、中值、高斯及双边滤波。图像平滑技术应用:导向滤波、污点修复及旋转文本校正

  • 图像采样: 上采样是讲图像分辨率扩大,下采样是将图像的分辨率缩小。
    • 最邻近插值
    • 双线性插值,应用广泛,稳定性高且时间复杂度较优
    • 图像金字塔:是一系列图像的集合,所有多个分辨率图像来自同一个原始图像。常用于图像的缩放或图像分割。
      • 向下采样 — 高斯金字塔
      • 向上采样 — 拉普拉斯金字塔
  • 傅里叶变换
    • 图像掩码操作:通过掩码核算子重新计算每个像素的值。
      • 基于像素邻域遍历
      • 基于 filter2D 函数
  • 离散傅里叶:将时域信号分解为不同频率的正弦波或余弦信号叠加之和。
  • 图像卷积
  • 图像噪声
    • 椒盐噪声
    • 高斯噪声
  • 空间平滑
    • 盒滤波
    • 均值滤波
    • 中值滤波
    • 高斯滤波
    • 双边滤波
  • 实际应用
    • 导向滤波:不仅能实现双边滤波的边缘平滑,而且在检测到边缘附近有较好的表现,可应用于图像增强、HDR压缩、图像抠图、及图像去雾等场景。
    • 图像污点修复:用来解决小区域污染以重构原始图像,如:去除文本和Logo图标等场景中,利用重构去除图像中的划痕和污点。
    • 旋转文本图像矫正,由于扫描仪扫描时未按照行列水平垂直扫描的现象。

第五章 边缘检测技术


边缘检测算子:Sobel、Laplace、Roberts、Prewitt、Canny 及 Marr-Hildreth。 几何检测,霍夫变换。轮廓检测及提取、角点检测技术、边缘检测应用实例:;颜色圆检测与车牌疑似区域点检测

  • 边缘检测目的是检测识别出图像中亮度变化剧烈的像素点构成的集合。图像边缘的正确检测有利于分析目标检测、定位及识别。
  • 根据边缘形成的原因,对图像进行求微分或者二阶微分可以检测出灰度变化明显的点。边缘检测大大减少了源图像的数据量,保留了图像的重要特征。常见的边缘检测分如下三种方式:
    • 一阶微分为基础的边缘检测,Sobel算子、Prewitt算子、Roberts算子及差分边缘检测
    • 二阶微分为基础的边缘检测,拉普拉斯算子、高斯算子、Canny算子边缘检测、
    • 结合一阶与二阶微分为基础的边缘检测。
  • 图像差分运算
  • 非极大值抑制:可以剔除伪边缘信息。
  • Sobel 算子
    • 效率高。当精度要求不是很高时,可选用。它对于沿x 轴和y 轴的排列表示的较好,但是对于其他角度表示的不够精确。这时可以使用Scharr滤波器。
  • 非极大值抑制 Sobel 检测
  • 图像直接卷积实现 Sobel
  • 图像卷积下非极大值抑制 Sobel
  • 基本边缘检测算子 — Laplace:它是最简单的向同性的二阶微分算子,具有旋转不变性。根据函数微分特性可知,该像素点值的二阶微分为零的点为边缘点。
  • 基本边缘检测算子 — Roberts 利用局部差分寻找边缘的一种算子,是最为简单的边缘检测算子。Roberts 算子利用对角线方向相邻两像素之差近似梯度幅值来检测边缘,检测垂直边缘效果好于其他方向,定位精度高,但对噪声的抑制能力差。
  • 基本边缘检测算子 — Prewitt:它对噪音有抑制作用,原理和 Sobel 相似。都是在图像方向利用两个方向模板与图像进行邻域卷积完成,分别对水平和垂直方向边缘进行检测。准确性不如 Sobel 算子。
  • 改进边缘检测算子 — Canny
    • 原理是通过图像信号函数的极大值来判定图像的边缘像素点,性能较好。
  • 最优边缘检测的评价标准有下面三个:
    • 低错误率
    • 高定位性
    • 最小响应
  • Canny 的原理及实现

    • 消除噪声:由于导数通常对噪声很敏感。故边缘检测算法常常需要根据图像源数据进行预处理操作。必须利用滤波器来改善与噪音相关的边缘检测性能。常常先对原始数据与高斯模板进行卷积操作,得到的图像与原始图像相比有些轻微的模糊。即使用高斯平滑滤波器卷积降噪。
    • 计算梯度幅值与方向。
    • 非极大值抑制
    • 用滞后阈值算法求解图像边缘
  • 改进的边缘检测算子 — Marr–Hildreth

    • 用于解决边缘检测的核心问题 — 定位精度与抑制噪声。它以高斯函数作为平滑算子,结合拉普拉斯算子提取二阶导数的零交叉理论进行边缘检测。称为LoG 函数,有被称为墨西哥草帽算子。
  • 几何检测

    • 霍夫变换:是从图像中识别几何形状的基本图像处理方法之一,应用广泛。经典的霍夫变换用来检测图像中的直线。改进的霍夫变换可以扩展到识别任意形状的物体。它不受图像旋转的影响,易于进行稽核图形的快速变换。
    • 线检测技术
    • LSD 快速直线检测,OpenCV3.0提供了 cv::LineSegmentDetector
  • 形状检测
    • 轮廓检测
    • 凸包检测:是计算几何图像学中的概念,凸包就是将最外层的点连接起来构成凸多边形,它能包含点集中的所有点。物体的凸包检测常用于物体识别、手势识别及边界检测等领域。
    • 轮廓边界框:物体轮廓检测出来后,我们常常会根据物体形态进行边界提取,常用的边界提取有矩形框、圆形框、椭圆形框等。
      • OpenCV中提供了大量的轮廓、边缘及边界检测相关函数。
      • approxPolyDP() 表示对多边形曲线做近似
      • boundingRect() 表示计算并返回保卫轮廓点集中的最小矩阵;
      • 函数 minEnclosingCircle()表示计算完全包围以有轮廓最小圆;
      • 函数 minAreaRect() 表示计算二维点集形成封闭、倾斜、及最小面积的矩阵
      • fitEllipse() 表示符合椭圆点集生成
    • 轮廓矩:图像矩是通过对轮廓上所有的点进行积分运算而得到的一个粗略的特征。
    • 点多边形测试:它用来判断点集是否在被测试多边形的内部,是轮廓点集判断的重要技术点之一。
    • 角点检测
      • moravec 角点
      • harris 角点
      • Shi-Tomasi 角点
  • 实例应用
    • 颜色圆检测
      • 我们遇到的图像一般是真彩色图像,检测圆目标时常带着颜色信息,霍夫变换圆检测在颜色圆检测中主要解决两个问题:
      • 检测输入函数集的所有圆,进行形状区分
      • 尝试对颜色通道阈值化处理,分离特殊颜色圆
    • 车牌区域检测

第六章 形态学技术


主要讨论:腐蚀和膨胀操作、开闭运算操作和实现、形态学梯度操作、形态学TOP-Hat、形态学应用实例:角点提取与车牌区域检测

数学形态学是基于集合论的图像处理方法,在图像中的形态学操作用于图像的预处理操作(去噪、形态简化)、图像增强(骨架提取、细化、凸包及物体标记)、物体背景分割及物体形态量化等场景,数学形态学利用点集的性质、积分几何集及拓扑学理论对物体像素集进行变换。

  • 腐蚀膨胀操作
    • 形态学膨胀操作,实现了对目标像素点进行扩展。
    • 形态学腐蚀可以看成是膨胀的逆操作,腐蚀对原区域缩小。
    • OpenCV 中提供了 erode() 和 dilate() 函数用于形态学腐蚀和膨胀操作。
  • 开闭运算操作
    • 形态学开操作能去除噪音及平滑目标边界。先对图像进行腐蚀操作,然后再进行膨胀操作。机构元素各向同性的开运算操作主要用于消除图像中小于结构元素的细节部分,物体局部形状不变。
    • 形态学闭操作能填充目标区域内的离散小空洞和分散部分,先用结构元素 B 对 A 进行膨胀,然后再进行腐蚀。能够排除小型黑洞,消除低于邻近点的孤立点,达到去噪的作用,可以平滑物体轮廓。
    • OpenCV 中提供了 morphologyEx 函数用于形态学开闭操作。
  • 形态学梯度
    • 梯度主要用于刻画目标边界或边缘位于图像灰度级别剧烈变化的区域,形态学梯度根据膨胀或腐蚀与原图像作差组合来实现增强结构元素邻域中像素的强度,突出高亮区域的外围。
  • 形态学 Top-Hat :指形态学顶帽操作与黑帽操作,前者是计算原图像与开运算结果图之差,后者是计算闭运算结果图与原图像之差,是一种常见的形态学滤波器,具有高通滤波器的某部分特性,可是想在图像中检测出周围背景亮结构或周围背景暗结构。顶帽常用于检测图像中的峰结构,黑猫常用于检测图像中的波谷结构。
  • 实例应用:
    • 形态学滤波角点提取:利用膨胀与腐蚀变化区域特征来完成边缘检测,膨胀是将目标物体向周围邻域扩展,而腐蚀是收缩,故将膨胀与腐蚀得到的结构图进行作差运算,就可以得到物体的边缘。在进行阈值化处理即可。
    • 车牌目标提取

第三部分 图像应用技术

第七章 图像分割技术

图像分割是在进行图像分析时需要获取图像中某些感兴趣的部分。它利用图像的特征灰度、颜色、纹理和形状将具有独特特征的区域进行划分。根据分割的成因可分为连续分割和非连续分割。连续分割是指将具有同一灰度或相同特征的像素划分成不同的区域,有区域生成、阈值分割及聚类分割等。非连续分割是利用像素值突变特性来呈现不同边界区域以实现图像分割,常见的有点线检测、边缘及能量等。

本章主要要探讨的内容有分水岭原理及其实现、FloodFill 分割技术、均值漂移 meanShift、Grabcut图割技术、图像分割应用实例:奇异区域检测与肤色检测

  • 分水岭分割
    • 分水岭分割是基于模拟水流通过地形起伏的现象从而研究总结出的一种分割方法,其基本原理是将图像特征看作地理上的地貌特征,利用像素的灰度值分布特征,对每个符合特征的区域进行划分,形成边界以构成分水岭。
    • 对于分水岭算法中的图像像素点,一般关注下面三个特征点:
      • 局部最值点。
      • 交汇边缘点
      • 连接区域点
    • 分水岭算法是一种很好的分割相互接触的物体图像的方式,但在边缘分割时精度存在一定问题。实际应用场景中,存在噪声或者其他干扰信息会导致局部极值点过多,就无法实现图像分割。
  • 分水岭分割合并:首先计算分割部分的像素归属,利用直方图信息统计相关特征,对每个分割部分统计直方图对比的相似性,然后根据相似性判断分割的两个部分是否需要合并成一个区域。
  • FloodFill 分割:泛洪填充算法,通常来说是自动选中与种子像素相关的区域,利用指定的颜色进行区域颜色替换,可用于标记或分离图像的某些部分。如 Windows 的油漆桶和Phottoshope 的魔术棒都是用它来改进和延伸的。
  • FloodFill 算法原理很简单,就是从一个点开始遍历附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充成新颜色为止。它常见的有 4 邻域像素填充法、8邻域像素填充法、基于扫描线的像素填充方法。
  • 均值漂移 MeanShift: 是一种核密度估计方法,用来分析复杂多模特征空间,其算法本质是最优化理论中的梯度下降法,沿着梯度下降方法寻找目标函数的极值。图像分割是找到每个像素点所属类中心,均值漂移认为类中心是概率密度的极大值点。对于任一像素沿着梯度方向总能找到其极值点。算法实现如下:
    • 平滑 Mask 点搜索
    • mask 点聚类
    • 合并相似小区域
  • 图割 Graphcut 是一种基于图论的分割方法,应用于前背景色分割、医学处理、纹理分割及立体视觉等方面。Grabcut是其改进算法。
    • Graphcut 的目标和背景模型是灰度直方图,的能量最小化分割是通过一次计算实现的,需要输入前景与背景区域点集。
    • Grabcut 采用的是 RGB 三通道混合高斯模型,根据分割模型参数更新完成的学习过程;只需要提供含有背景的区域像素集就可完成分割。
  • 实例实践
    • 1、奇异区域检测:通常是指与周围邻域有着某些特征(颜色或灰度) 差别的区域。常见的奇异区域如医学领域 X 光照片或 CT 某些特定组织、天空中降落等,奇异区域相对于点区域检测更稳定,在目标分割及检测、图像配准、特征分析等领域有广泛的应用。
    • 计算机视觉中我们常常关注的目标特征是颜色和灰度,刻画图像中两个区域的视觉相似性有许多方法,如形状描述子、颜色特征、距特征等。
    • 奇异区域检测主要是通过微分检测或局部极值的分水岭算法实现。基于图像中的奇异区域的邻域像素值或大或小的特征,我们可以通过计算图像中的局部极值点来实现相应兴趣区域的检测。一般实现奇异区域检测有如下两种方法:
      • 基于微分检测器检测。拉普拉斯算子是检测图像奇异区域常用的方法,二维高斯经过拉普拉斯变换后的到。图像与高斯拉普拉斯函数进行卷积操作实际上求取的是图像与这一函数的相似性,奇异区域表现出来的特征就是图像中呈现比它周围像素灰度值大或小的区域,二维高斯拉普拉斯变换呈现出的就是这种特性。一般用它检测图像局部极值点时,需要先对图像进行低通滤波,去除伪点噪声。
      • 基于局部极值的分水岭检测。局部极值的分水岭检测奇异区域是对原图像进行多间隔区域二值化操作,对一个二值化图像提取相应的连通域并计算相应区域的连通中心;根据中心点拟合归类成同一块 group,得到对应的 blob 特征;最后根据得到的中心点集group 估计出 blob 特征和对应的半径。
    • 2、肤色检测
      • 肤色检测利用了计算机对人体皮肤像素的分析过程,随着人脸检测技术、表情识别、手势识别等技术的快速发展,肤色应用的领域日益增多,它常用的方法有基于颜色空间、光谱特征、及肤色反射模型。这些方法主要步骤是先进行颜色空间变换,然后再建立肤色模型。颜色空间有 RGB、YCrCb、HSV和Lab等。皮肤模型中有单高斯模型、混合模型、贝叶斯模型和椭圆模型等,高斯分布模型用于刻画椭圆高斯概率,对肤色与非肤色采用高斯混合模型在特定的区域内能取得较好的实验效果。
      • 其中 YCbCr 颜色空间是一种常见的肤色检测的色彩模型,其中 Y 代表亮度,Cr代表光源中的红色分量,Cb 代表光源中的蓝色分量。

第八章 特征分析

本章主要探讨以下内容:尺度空间相关基本概念、常见的特征描述子 SIFT、SURF 及 ORB、方向梯度直方图 HOG 提取及特征描述、局部二值模式 LBP 提取及实现、Haar特征提取及实现、特征分析应用实例:最近邻特征点目标提取、MSER 检测、字符特征提取及车牌字符 SVM 训练

  • 尺度空间:当利用计算机系统分析未知场景中的目标时,系统无法得知我们关注的目标物体的尺寸,因此,需要考虑如何描述目标物体的尺寸空间。
  • 尺度与旋转不变性
    • 对于目标物体,我们希望通过物体存在的一些显著区域的特征来描述它,对车辆进行描述时,读取车牌、轮胎、车标等特征,对人脸进行描述时,我们关注鼻子、眼睛、耳朵等特性。当利用计算机来分析目标物体图像时,我们重点关注的是目标与背景区域的差异性。
    • 局部不变形是目标特征分析中重要的性质之一。它包括尺寸不变性和旋转不变性。尺寸不变性描述的是物体视觉上远近与目标的认知分析无关,摄像机相对物体远近呈现出来的物体尺寸不受其大小的影响。高尺度意味着目标物体越小,摄像机放置较远,低尺度反之。高尺度操作通常是利用图像平滑技术的高斯滤波或下采样,低尺度操作通常是利用高斯核核上采样。旋转不变性是物体发生旋转操作与目标认知分析无关,它强调目标特征的多角度信息特征。
  • 特征点尺度变换
    • 高斯核是唯一可以产生多尺度空间的核,高斯模板具有圆对称性,通过高斯卷积操作对原始像素重新分配权值,距离中心越远的相邻像素权值分配的相对较小。
    • OpenCV 中提供了函数 cvSmooth 或 GaussianBlur 专门用于高斯卷积操作,利用这两个函数可进行图像尺寸空间的转换。
  • 特征描述子:特征描述是目标分析技术之一,关键点检测与关键点提取是目标特征分析的重要步骤。局部图像特征描述的核心基本问题是不变性和可分性,不变性是基于特征描述对视角变化的不变性、尺度变化的不变性及旋转变化的不变性等,可分性是基于局部图像内容的可区分性。
  • OpenCV 中常见的特征描述子有多种,如 SIFT、SURF、及ORB特征描述子。
    • SiFT 是最为广泛的关键点检测和描述算法,关键点描述也称特征点描述,SIFT 特征提取充分利用了图像的局部信息。
    • 它具有旋转、尺度、平移、视角及亮度的不变性,有利于对目标特征信息进行有效的表达。其外,它对参数调整鲁棒性好。
    • SIFT 特征算法局部特征点的提取主要有四个步骤:
      • 疑似关键点检测
      • 去除伪关键点
      • 关键点梯度
      • 方向匹配及特征向量生成
    • OpenCV 中提供了用于 Sift 特征描述及提取的类 SiftFeatureDetector 它继承于子类DescriptorExtractor
    • 该算法实现的基本思路是,首先将源图像转换为灰度图像并归一化处理;接着定义 SIFT 描述子,分别计算两幅图像的特征点向量;然后利用 BruteForceMatcher 进行两幅图像的关键点匹配,对匹配结构的向量进行二分排序,根据排序结果筛选特征向量;最后去除特征点不匹配情况,输出最终特征点检测及匹配情况。
    • SURF (Speed up Robust Features) 特征是对 SIFT 特征的改进,SIFT 算法最大的缺点是如果不借助硬件加速或专门的图像处理器很难达到实时。SURF 算法的实现原理借鉴了 SIFT 中的简化思想,把 DOH(高斯差分算子) 中高斯二阶微分的模板简化,是的卷积平滑操作仅需要转换成加减运算,SURF 算法的鲁棒性好且时间复杂度低。SURF 特征不仅能保持 SIFT 的尺寸不变性与旋转不变性,而且对光照变化和仿射变化同样具有很强的鲁棒性。
    • SURF 算法使用了矩形盒滤波器来近似模拟高斯函数的二阶偏导数。矩形盒滤波器由简单的矩形模板构成,加快了卷积计算速度。减小了整个过程的时间复杂度。
    • 它实现图像尺寸的不变性,同样采取了图像金字塔模型。SURF 特征点的方向取决于以兴趣点伪圆心,半径为 6 σ的圆形区域响应,计算其邻域每个点集的水平与垂直盒滤波器,即 Haar 特征。
    • 生成 SURF 特征向量包含如下三个步骤:
      • 构建特征点邻域的正方形区域,边长为 20 σ,其中 σ 为兴趣点的尺度,旋转正方形邻域到该特征点主方向。
      • 将上一步骤构建的正方形区域划分成 4 * 4 个子区域,在每个子区域里,计算 5 * 5规则网络空间里的 4 维特征向量,该特征包含 Haar 小波对水平与垂直方向的响应和的绝对值。
      • 计算每个子区域的 4 维特征并进行累加,将分成的 16 个子区域进行累计得到最终的 64 维特征向量描述子。
    • ORB 特征:它是基于 FAST 角点的特征点检测与描述技术,它在运行时间远优于 SIFT 与 SURF,可应用于实时性特征检测。ORB 特征检测也具有尺度与旋转不变性,同时对噪声及仿射也具有不变性。ORB 特征检测主要一下面两个步骤:
      • 方向 FAST 特征点检测,FAST 角点检测是一种基于机器学习的快速角点特征检测算法,具有方向的FAST 关键点检测是对兴趣点所在圆周的16个像素点进行判断,若判断后的当前中心像素为暗或者亮,将决定其是否为角点。FAST 角点检测为加速该算法,对圆周上的点集进行排序,使计算过程大大得到了优化。FAST 多尺度特性通过建立图像金字塔获得,引入灰度质心法用于实现特征点方向。
      • BRIEF 特征描述:该算子主要通过随机选择兴趣点周围区域的若干点来组成小兴趣区域,将这些小兴趣区域的灰度二值化并解析成二进制码串,将串特征作为该特征点的描述子。由于它所有的编码都是二进制故节省了计算机的存储空间。
    • 方向梯度直方图 HOG
      • HOG 原理是通过计算和统计图像局部区域的梯度方向直方图来实现特征描述的。图像梯度方向直方图就是对图像中所有像素点 K 维特征的直方图统计,将图像划分成小部分连通域,对细胞单元的各个像素点进行梯度方向直方图描述,最后组合成相应的特征描述器。梯度方向直方图特征提取步骤如下:
        • 归一化处理。
        • 计算图像梯度
        • 统计梯度方向
        • 特征向量归一化
        • 生成特征向量
    • 局部二值模式 LBP
      • LBP 是一种描述图像局部纹理的特征算子,该算子具有旋转不变性和灰度不变性等。经典的 LBP 算子定义为以窗口中心像素为阈值,将其相邻 8 邻域灰度图像与中心像素比较,若周围像素值大于中心像素值,该中心像素位置被标记为 1,否则为 0.
      • 圆形 LBP 经典的 8-邻域来描述图像的纹理特征,其缺点是难以满足不同尺寸和频率的需求。提出将 3*3 正方形窗口邻域扩展到任意圆形邻域,圆形邻域满足半径为 R 可采样到N 个像素点。
    • Haar 特征描述
      • Haar 特征由黑白矩阵模板组成,特征值由白色矩阵和与黑色区域像素和相减得到。Haar 特征的计算量较大,一般进行特征描述时是通过计算积分图像来完成的。积分图也称求和表,每个区域只需要访问 4 次,然后进行 3 次求和就可以完成。
  • 应用实例:

    • 1、最近邻特征点目标提取:
    • 快速最近邻逼近搜索函数库用来解决 SURF 高位特征向量空间中的最近邻搜索问题。由于高维空间计算量大,为了提高性能,采用分层 K-均值树和多重随机 KD 树。目前最有效的高维数据特征查找常采用 FLANN 最近邻算法。使用 FlannBasedMatcher 接口可实现目标特征点匹配,通过两幅图像的场景匹配情况就可以提取出感兴趣的目标区域。利用 FLANN 特征点匹配完成目标提取:
      • 利用 SURF 特征提取待匹配目标关键点,利用 SurfFeatureDetecotr 实例构建特征点检测器,然后通过SurfDescriptorExtractor 描述器提取目标SURF 特征。
      • 利用FlannBasedMatcher 对两幅图像SURF特征描述进行特征匹配检测,利用特征点距离特征进行最佳特征点筛选。
      • 根据 drawMatches 实现匹配特征点绘制,然后构造仿射变换矩阵对检测出的特征点进行变换,最后根据变换矩阵实现目标提取。
    • 2、最大值稳定区域匹配 MSER
      • 它是一种类似分水岭图像分割与匹配算法,它具有SIFT、SURF及ORB 等特征不具备的仿射不变性。它被认为是当前性能最好的仿射不变性区域检测方法。
      • 它的提取步骤如下:
        • 像素点排序
        • 极值区域生成
        • 稳定区域判定
        • 区域拟合
        • 区域归一化
      • 利用 MSER 完成候选车牌区域检测主要是通过MSER+ 和MSER- 来提取目标像素的区域点。根据极大值稳定区域形成原理,车牌字符区域存在明显的边缘分布与梯度分布,利用灰度及反值灰度提取出 MSER 特征点,在此基础上进行位与操作,最后检测出候选车牌区域。
    • 3、字符特征提取
      • 特征字符提取是计算机视觉场景中字符识别的关键技术之一,常应用于在车牌字符识别、OCR字符识别及公路指示牌字符识别等领域。
      • 特征字符描述是根据待识别图像产生一组原始特征,在结合计算机视觉算法提取字符区域特有的显著特征,最后生成描述字符特征向量。字符分割经过归一化后,为了克服场景光照变化不同的影响,对单字符图像需先进行直方图均衡化。本节实现采用对单字符特征描述采用120维特征,其中利用简化梯度直方图特征(HOG) 64维,结合字符的水平投影32维与垂直投影16维,同时提取子窗口特征8维实现。
    • 4、车牌字符 SVM 训练

    第九章 复杂视频处理技术

    视频稳像技术原理及实现、图像拼接 Stitcher、高动态范围 HDR 图像生成、背景建模—混合高斯模型、应用实例:车辆运动目标提取、TLD 单目标跟踪及人眼检测与跟踪

  • 视频稳像技术:
    • 它是解决由于某些原因产生的视频系列中的图像模糊问题,常见的图像模糊问题包括快速移动目标运动模糊、摄像头方向偏离/倾斜/翻转及图像坐标移动等。视频稳像技术是对随机抖动或运动摄像机所获得的动态图像进行重新处理,使其在图像输出时能稳定显示,这种技术能够消除或减弱图像序列之间的不规则移动、旋转及缩放等失真场景,进而提升图像质量。
    • openCV3.x 中提供了专门应用于视频稳像技术的模块,该模块包含一系列用于全局运动图像估计的函数和类。如:videostab::RansacParams 等
    • 视频稳像系统包含如下模块:运动估计、帧变换技术、运动补偿模块。该系统重点在于运动估计模块,局部或全局运动估计有多种方法,如:投影法、特征法、块匹配法及光流法。
    • 运动估计是视频稳像系统的起始步骤,影响着整个系统性能,常通过 RANSAC (随机抽样一致性) 来实现连续帧间运动估计。该算法首先随机选取观察数据子集,通过这些子集来拟合相应的数学参数模型,然后进行观测点数据验证,RANSAC 通过反复选取数据集中的一部分子集来评估模型。
    • RANSAC 可应用于图像特征点提取、图像全景拼接、图像匹配及图像搜索目标识别定位等场景。
  • 图像拼接
    • 图像拼接是利用连续帧图像生成全景图或者更高分辨率的图像,通常图像拼接需要消除图像拼接部分的缝隙间隔,因此需要进行重叠区域匹配修复。全景图像是平面图像映射到一个弯曲表面发生的图像投影。
    • 图像拼接分为三个步骤:
      • 特征点检测:对序列图像进行特征点检测,可使用OpenCV中提供的角点检测方法来对序列图像进行特征点提取。特征点筛选采用RANSAC 提取有效样本特征点。
      • 图像标定
      • 图像融合
      • OpenCV 中提供了图像拼接库可实现图像间的缝合连接。
  • 高动态范围图像 HDR
    • HDR 合成技术:高动态范围 HDR 图像合成是利用计算机处理技术,将普通数字图像准换成高质量图像。场景中不同曝光度的图像的视觉效果各异,为了丰富视觉观察效果,HDR 应运而生。图像动态范围是指图像中像素亮度的最大值与最小值的比值,即最亮和最暗的灰度等级划分,动态范围越大,图像细节层次越丰富,表现形态越细腻,高动态范围用来描述最亮和最暗比值达到很高时的等级。它最大的变革就是来自于浮点数据的引入,采用浮点方式来处理和存放亮度数据。
    • HDR 高动态范围图像生成,通常是根据图像的不同曝光度结合几何相机响应曲线标定和压缩算法完成 HDR 图像合成。
    • OpenCV 中的 photo 模块提供了 HDR 图像生成相关函数及类。
  • 背景建模
    • 运动检测通常用于分析视频序列中的移动目标,如车辆和行人检测,所解决的问题是在场景中分离前景色与背景。背景建模是实现运动目标检测的基础之一,通过对原始场景的求解背景,利用当前图像帧与背景作差就可以粗略地实现运动目标区域点提取,通常每幅图像中检测到的运动目标是用其最小尺寸(如圆、椭圆、矩形及正方形等)来表示的。
    • 背景差分:对两幅图像作差得到差分图像,视频序列中的当前帧视频图像减去背景将得到图像帧中的运动目标。OpenCV 中提供了函数absdiff()用于计算图像差分运算。
    • 背景的建立并不是固定不变的,通常需要维护一个动态背景帧,最简单的背景建立是通过对过去 N 帧数据进行像素点统计,并计算像素点的均值或中值。这种背景建立方法简单,但对运动速度较慢。亮度变化小的目标存在统计丢失现象。
  • 混合高斯背景建模
    • 混合高斯模型既保存滑动平均值,同时也保存滑动方差,即把背景图像中的每个像素点分别用 K 个高斯的混合分布来描述。
    • 在 OpenCV 中提供了BackgroundSubtractor 类用于实现背景建模算法。其中派生出的 BackgroundSubstractorMOG 是基于高斯混合模型的背景和前景分割算法。
  • KNN 模型背景建模实现
    • 该方法应用 K 邻近思想,实现前景目标变换较小场景下背景模型的建立。OpenCV 中实现了类 BackgroundSubtractorKNN
  • GMG 模型背景建模
    • 该方法基于数学统计背景模型估计,首先统计 RGB 颜色空间下直方图信息并进行量化,然后根据 T 帧图像训练初始化数据像素背景,在利用贝叶斯规则来计算一个像素被分类为前景色的可能性,最后通过背景模型特征更新参数生成前景目标。
    • OpenCV 中提供了基于数学统计的背景模型类BackgroundSubtractorGMG 实现。
  • 级联分类器 — 人脸检测
    • 人脸检测有两大类:
      • 基于几何特征,如眼睛、眉毛、鼻子及嘴巴的性对位置特征
      • 基于统计特征的人脸检测:利用模式识别的方法实现特征人脸的训练,在进行相似度判断,如支持向量机、神经网络及 adaboost 等分类方法。
    • 级联分类器:是将若干个分类器进行连接,从而构成一个多项式级的强分类器方法,单个分类器可以由若干个弱分类器加权组成。
    • OpenCV 中提供了用于检测物体的级联分类器 CascadeClassifier 函数
  • 应用实例
    • 运动目标提取根据实验场景内各个运动目标的情况,通过背景建模技术可实现实时运动目标检测。而就背景建模来说,从算法的时间复杂度来说,混合高斯及其改进方法对分辨率高的图像建立背景模型计算耗时大,因此需要考虑进行图像预处理操作。由于场景尺寸对于后端图像的分析影响较大,故首先考虑的就是对源图像进行缩放,在利用改性混合高斯模型进行背景提取。本节在实现运动目标提取时,首先利用图像下的采样双线性插值对源数据图像进行缩小操作,利用高斯混合模型背景建模得到运动目标区域,然后对区域进行形态学闭操作,填充运动目标区域的间断点,在对目标区域求解其连通域并选取连通域的最大外接矩阵,最后通过对车辆目标的基本形态筛选完成车辆的目标检测。
    • TLD (Tracking-Learning-Detection)单目标跟踪可实现单目标长时间跟踪,该算法将检测与跟踪结合起来,它由三个模块构成,追踪器、检测器、及在线学习模块。追踪器完成跟踪连续帧间目标的运动情况,当目标始终可见时,追踪器才能实现其功能,追踪器可以根据上一帧的目标检测结果预测出当前帧目标可能出现的区域,得到正样本轨迹;检测器完成对追踪器的修正,对当前帧图像进行遍历,找到与目标物体相似的所有可能位置,从检测产生的结果中得到正负样本,检测器将所有检测窗口中最可信的位置作为 TLD 输出结果;在线学习模块根据追踪器与检测器得到的正负样本,迭代训练生成相应的分类器,实现检测器相应参数的修正与性能完善。在线学习模块采用了 P-N Learning 算法,是一种半监督机器学习算法。
    • 人眼检测与跟踪:使用了用于人脸检测的级联分离器,检测出人脸位置,然后利用人眼级联分类器在人脸区域上检测出人眼目标,最后应用模块匹配技术实现人眼的自适应跟踪。

注: 此均为笔者辛苦整理,如果对您有帮助,还望去点一个赞,留下你的脚步,以便激励笔者以后分享更加有干货的技术文章,谢谢您的理解 ~ ~ ~

所对应的代码在此,链接:https://pan.baidu.com/s/1LdTlCvwmJNy3G3e1oGVUaA

密码:9n70

2019-08-18 17:25:59 qq_45507524 阅读数 13
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4121 人正在学习 去看看 贾志刚

一、将图像分为RGB三个通道的图像,转换为灰度图,并画出直方图
1.首先要学会如何读取并展示出一张图片:

# -*- coding: cp936 -*-  
#  防止中文出错
import cv2     #引入OpenCV库
img=cv2.imread('D:/Camera Roll/aling.jpg',1)
# 括号左边填入你所选照片的地址(如果照片和py文件在一个文档里面可以直接输入照片名字),括号右边默认为1彩色图片,当填入0时读取的是灰色图片
cv2.namedWindow('img')   #取一个窗口的名字
cv2.imshow('img',img)    #展示图片
cv2.waitKey(0)   #使图片停留在屏幕上,不至于很快闪退
cv2.destroyAllWindows()    #关闭所有窗口

运行结果为:

在这里插入图片描述
2.进行RGB三通道输出、灰度图以及直方图

import  cv2
import numpy as np   #用np代替引入的numpy
from matplotlib import pyplot as plt
img=cv2.imread('D:/Camera Roll/aling.jpg')

b,g,r=cv2.split(img)   #进行通道分离
pic=np.zeros(np.shape(img),np.uint8)  #生成零矩阵
pic[:,:,0]=b
cv2.namedWindow('blue')
cv2.imshow('blue',pic)
cv2.waitKey(0)

pic=np.zeros(np.shape(img),np.uint8)
pic[:,:,1]=g
cv2.namedWindow('green')
cv2.imshow('green',pic)
cv2.waitKey(0)

pic=np.zeros(np.shape(img),np.uint8)
pic[:,:,2]=r
cv2.namedWindows('red')
cv2.imshow('red',pic)
cv2.waitKey(0)

color=("blue","green","red")
for i,color in enumerate(color):      #用于遍历序列中的下标和元素
    hist=cv2.calcHist([img],[i],None,[256],[0,256])
    #建立直方图([图像],[通道],掩膜:一般不需要,设为None,[256],[0,256])
    plt.plot(hist,color=color)
    plt.xlim([0,256])
 plt.show()

img=cv2.imread('D:/Camera Roll/aling.jpg',0)   #读取图片为灰度图
cv2.namedWindow('gray')
cv2.imshow('gray',img)
cv2.waitKey(0)

plt.hist(img.ravel(),256,[0,256])
plt.show()
cv2.destoryAllWindows()

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述二、运用数学函数对灰色图进行灰度转换
用一个y=-x+255,把黑的变成白的,把白的变成黑的

import cv2
import numpy as np
img=cv2.imread('D:/Camera Roll/wei.jpg',0)
# 获取图片的高度和宽度
height=img.shape[0]
width=img.shape[1]
# 建立一个零矩阵
result=np.zeros((height,width),np.uint8)

for i in range(height):
   for j in range(width):
      gray=255-img[i,j]     # 运用一个 y=-x+255 的数学函数
      result[i,j]=np.uint8(gray)
 
 cv2.imshow('gray',img)
 cv2.imshow('result',result)
 cv2.waitKey(0)
 cv2.destoryAllWindows()

运行结果:
在这里插入图片描述
在这里插入图片描述
三、createTrackbar函数的简单使用

import cv2
def callback(x):  #回调函数
   pass
 
 cv2.namedWindow('image')
 img=cv2.imread('D:/Camera Roll/wifi.jpg')
 # 建立一个滑块
 cv2.createTrackbar('num','image',0,255,callback)
while(1):
    num=cv2.getTrackbarPos("num","image") #获取当前滑块的位置
    ret,img1=cv2.threshold(img,num,255,cv2.THRESH_BINARY)
    cv2.imshow('image',img2)
    k=cv2.waitKey(1) & 0xFF
    if k==27:
       break
cv2.destoryAllWindows()
#  该程序按Esc结束

运行结果:
在这里插入图片描述
不同的num值,图像颜色对比不一样。

本人是第一次接触图像处理,很多东西还不是很懂,以后会多多学习的,如有错误请看到的小伙伴多多提醒。
有冒犯之处,请多原谅。

2016-06-13 23:05:24 ab0902cd 阅读数 322
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4121 人正在学习 去看看 贾志刚

图像的亮度及对比度调节可通过:g(i,j)=a*f(i,j)+ b 进行调整,f(i,j)为原来的像素,g(i,j)是调整后的像素,下面通过进度条来实现对亮度和对比度的调整。

#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;

static int bright_value;
static int contrast_value;
static Mat src, dst1,dst2;
static double alpha=0.01;

//进度条回调函数
static void onBright_ContrastChange(int ,void *) {
	for (int i = 0; i < src.rows; ++i) {
		for (int j = 0; j < src.cols; ++j) {
			for (int c = 0; c < 3; ++c) {
				//像素调整
				dst1.at<Vec3b>(i, j)[c]=saturate_cast<uchar> (alpha * bright_value )* (src.at<Vec3b>(i, j)[c] + contrast_value);
			}
		}
	}
	imshow("原始图像", src);
	imshow("效果图像", dst1);
}

int main(int argc, int **argv) {
	src = imread("F:\\img\\dota2.jpg");
	//dst2 = imread("F:\\dota_log01.jpg");
	dst1 = Mat::zeros(src.size(), src.type());
	if (src.empty()) {
		cout << "image src open failed !" << endl;
	}
	if (dst1.empty()) {
		cout << "image dst open failed !" << endl;
	}
	//创建原始和效果窗口
	namedWindow("原始图像",WINDOW_AUTOSIZE);
	namedWindow("效果图像", WINDOW_AUTOSIZE);

	//亮度和对比度初始值为80
	contrast_value = 80;
	bright_value = 80;
	//创建进度条
	createTrackbar("对比度:", "效果图像", &contrast_value, 300, onBright_ContrastChange);
	createTrackbar("亮度:", "效果图像", &bright_value, 200, onBright_ContrastChange);
	//回调函数初始化
	onBright_ContrastChange(bright_value, 0);
	onBright_ContrastChange(contrast_value, 0);

	waitKey(0);
	return 0;
}

结果:



Opencv图像预处理

阅读数 1827

没有更多推荐了,返回首页