2015-03-09 11:14:52 TonyShengTan 阅读数 6754
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19568 人正在学习 去看看 夏曹俊


学习DIP第57天
转载请标明本文出处:***http://blog.csdn.net/tonyshengtan ***,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro
更多图像处理机器学习内容请访问最新网站www.face2ai.com

#开篇废话
废话开始,今天说下区域阈值(局部阈值),前面介绍的阈值都是全局阈值,也就是阈值根据全局信息产生,而作用对象也是整幅图像的全部像素,而局部阈值的产生是一个中心像素c(x,y)c(x,y)的邻域的一些属性来计算出一个或多个阈值以及阈值的判别式。这句话比较难懂,举个例子,假设c的邻域R,根据邻域R计算出阈值T1,T2,T3.....TnT_1,T_2,T_3.....T_n我们可以表示成向量T=(T1,T2,T3....Tn)T=(T_1,T_2,T_3....T_n),设计阈值判别式Q(T,pixValue)Q(T,pixValue)其中pix_value的值就是像素c(x,y)c(x,y)的灰度值,判别式返回真假,真的话像素设置为亮,否则设置成暗。
#算法内容
内容迁移至:http://www.face2ai.com/DIP-7-7-灰度图像-图像分割-阈值处理之局部阈值/

http://www.tony4ai.com/DIP-7-7-灰度图像-图像分割-阈值处理之局部阈值/

2018-12-02 10:55:25 shanwenkang 阅读数 1424
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19568 人正在学习 去看看 夏曹俊

阈值

我们将图像分块最简单的方法就是设定一个阈值对图像进行二值化处理,那么这个阈值我们应该如何选择呢

对于图像的直方图存在明显边界的图像,我们可以很容易找到这个阈值,但是如果图像直方图分界不明显,那么这个阈值的寻找将变得十分困难。因此我们存在全局阈值与局部阈值两种

全局阈值

全局阈值就是在整幅图像中我们只有一个阈值来对图像进行二值化,但是其存在其局限性,例如图像中存在高斯噪声的情况下,我们无法找到一个很好的阈值将图像的边界分开

另外如果图像的边界是在局部对比下出现的,即不同位置阈值不同,那么全局阈值的效果也非常不好

我们先不管全局阈值的缺点,我们来看看我们如何通过计算来获得这个全局阈值T呢?我们又OTSU'S算法

下面是一些数学概念在图像上的体现

OTSU算法就是想把图像分为两个块,然后使得这两个块之间的方差最大,也就是最大化两个块的均值与全局均值的差的平方

由于只存在这么一个阈值,那么我们在计算的时候可以简单地让这个值遍历0-255,然后找到σB最大的值,这个值就是我们要的阈值。我们可以理解为这个值把图像分为了相距最远的两块。我们在matlab中有graythresh这个函数来实现这个过程

下图就显示了一个OTSU算法不是很理想的例子

为了克服以上缺点我们有两点解决方法:1.先通过低通滤波器去噪再用OTSU 2.只在考虑边缘部分的像素来计算阈值,这样可以大大减少其他不重要部分对阈值计算过程的影响

局部阈值

下面让我们来看看局部阈值/自适应阈值。它的原理就是将图像分块,对于不同的部分应用不同的阈值,在matlab中我们有blockproc这个函数来实现这个过程

我们看到相比于之前,效果确实有很大的提升,但是缺点也特别明显,就是图像会出现分块化

我们可以调小块的大小,但是这样的话会出现如果块内像素值变化不大的话,块内像素被全部分作黑或白而缺失了边界(例如右上角窗户的上方黑色的窗框内有白色的像素块)。因此块的选择是十分重要的

更好的方式是我们在每个像素周围的一个区域内来计算阈值,根据这个块内的均值方差来计算这个像素的值是1还是0

RGB图阈值

除了将阈值在灰度图上应用,我们还可以将其应用在RGB图中,我们可以设定一种颜色,来得到与这种颜色相近颜色的物体

例如我们取下图丝带的颜色可以得到如右图的结果

 

 

2015-01-02 18:04:08 hh555800 阅读数 13434
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19568 人正在学习 去看看 夏曹俊

     1996年,Prewitt提出了直方图双峰法,即如果灰度级直方图呈明显的双峰状,则选取两峰之间的谷底所对应的灰度级作为阈值。


注意:应用灰度直方图双峰法来分割图像,也需要一定的图像先验知识,因为同一个直方图可以对应若干个不同的图像,直方图只表明图像中各个灰度级上有多少个象素,并不描述这些象素的任何位置信息


该方法不适合直方图中双峰差别很大或双峰间的谷比较宽广而平坦的图像,以及单峰直方图的情况。


70年代初,研究工作集中在直方图变换,但无论是直方图还是直方图变换法都仅仅考虑了直方图灰度信息而忽略了图像的空间信息。


2019-10-25 23:21:22 qq_43294951 阅读数 24
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19568 人正在学习 去看看 夏曹俊

由于OTSU比较简单,就是一个遍历来寻找最大的阈值分割的灰度值点,故本例直接给出代码,不做细评,代码如下,具体的写在代码注释

#include <iostream>
#include <opencv2/opencv.hpp>
#include <Eigen/Dense>
#include <math.h>
#include <stack>
#define _MATH_DEFINES_DEFINED
using namespace std;
using namespace cv;
using namespace Eigen;
float Otsu(const Mat& image,int T)
{
	int nr = image.rows;
	int nl = image.cols;
	Mat hist = Mat::zeros(1, 256, CV_32F);
	float* hi = hist.ptr<float>(0);
	float junzhi=0;//定义总均值,类一均值,类二均值
	float junzhi0 = 0;
	float junzhi1 = 0;
	float lei0 = 0;//定义类一,类二的概率
	float lei1 = 0;
	float fangcha0=0;//定义类一,类二的方差
	float fangcha1 = 0;
	float neifangcha = 0;//定义类内方差
	float jianfangcha = 0;//定义类间方差
	float zongfangcha = 0;//定义总方差,类内加类间
	float ppppp = 0;
	for (int i = 0; i < nr; i++)//这里是统计直方图
	{
		const float* im = image.ptr<float>(i);
		for (int j = 0; j < nl; j++)
		{
			hi[int(im[j])] = hi[int(im[j])] +1;
		}
	}
	//cout << hist << endl;
	for (int i = 0; i < 256; i++)//计算均值
	{
		junzhi = i * hi[i] / nr / nl;
	}
	for (int i = 0; i <= T; i++)//计算
	{
		lei0 = lei0 + hi[i] / nr / nl;
	}
	for (int i = T+1; i <256; i++)
	{
		lei1 = lei1 + hi[i] / nr / nl;
	}
	for (int i = 0; i <= T; i++)
	{
		junzhi0 = junzhi0 + i * hi[i] / nr / nl / lei0;
	}
	for (int i = T + 1; i < 256; i++)
	{
		junzhi1 = junzhi1 + i * hi[i] / nr / nl / lei1;
	}
	for (int i = 0; i <= T; i++)
	{
		fangcha0 = fangcha0 + (i -junzhi0)* (i - junzhi0) * hi[i] / nr / nl / lei0;
	}
	for (int i = T + 1; i < 256; i++)
	{
		fangcha1 = fangcha1 + (i - junzhi1) * (i - junzhi1) * hi[i] / nr / nl / lei1;
	}
	neifangcha = lei0 * fangcha0 + lei1 * fangcha1;
	jianfangcha = lei0 * lei1 * (junzhi1 - junzhi0) * (junzhi1 - junzhi0);
	zongfangcha = neifangcha + jianfangcha;
	ppppp= jianfangcha / zongfangcha;
	return ppppp;
}
int getT(const Mat& image, Mat& new_image)
{
	int temp = 0;
	float max = 0;
	max = Otsu(image, 20);
	for (int i =  0; i < 255; i++)
	{
		float gg = Otsu(image, i);
		if (max < gg)
		{
			temp = i;
			max =gg;
		}
	}//遍历得到最大的分割点temp
	for (int i = 0; i < image.rows; i++)
	{
		const float* im =image.ptr<float>(i);
		float* p = new_image.ptr<float>(i);
		for (int j = 0; j < image.cols; j++)
		{
			float ge = im[j];
			if (ge <= temp)
			{
				p[j] = 0;
			}
			else
			{
				p[j] = 255;
			}

		}
	}//图像进行二值化
	return temp;
}
int main()
{
	Mat image = imread("I:/C.jpg", IMREAD_GRAYSCALE);
	imshow("原图", image);
	Mat IM;
	image.convertTo(IM, CV_32F);
	//imshow("fsSSd", IM);
	Mat new_image = Mat::zeros(IM.rows, IM.cols, CV_32F);
	int T = getT(IM, new_image);
	cout << T << endl;
	imshow("分割以后", new_image);
	cv::waitKey(0);
}

ok,得到的阈值分割图如下,感觉海星
在这里插入图片描述

2015-03-06 15:55:24 TonyShengTan 阅读数 2862
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19568 人正在学习 去看看 夏曹俊


学习DIP第52天
转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro
更多图像处理机器学习内容请访问最新网站www.face2ai.com

#开篇废话
好久没写博客了,已然不熟练了,过完年整个人都不好了,哈哈,到刚才为止算是把图像分割学习了一下,这两天把学习结果和代码简单总结一下。
前面已经介绍了边缘检测,和边缘修复,阈值处理的基本概念也进行了一定介绍。阈值处理速度快,算法简单,所以应用比较广泛,算法的基本问题在于计算出阈值处理的阈值,在接下来的几篇我可,介绍几种确定阈值的算法,基本数学知识都来自统计学,包括最简单的平均数,p-分位数,方差等数学知识。
下面就从最简单的均值阈值开始介绍。
#平均阈值
内容迁移至 http://www.face2ai.com/DIP-7-1-灰度图像-图像分割-阈值处理之平均阈值/

http://www.tony4ai.com/DIP-7-1-灰度图像-图像分割-阈值处理之平均阈值/

opencv2-第五章-图像处理之阈值化

博文 来自: gdut2015go
没有更多推荐了,返回首页