2019-08-20 17:31:17 qq_33668060 阅读数 648
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

@迭代法求取阈值进行图像分割

迭代法求取阈值进行图像分割

它的主要思想是:图像分割后的两部分A和B的均值和基本保持稳定。也就是说,随着迭代的进行,取 [mean(A)+mean(B)]/2 最终的收敛值作为分割阈值。

在这里有一点需要注意
为了提高收敛速度,初始阈值T0的选择要稍微注意些。当目标与背景的面积相当时,可以将初始阈值T0设置为整个图像的平均灰度值;当目标与背景的面积相差较大时,更好地选择是将初始阈值T0设置为最大灰度值和最小灰度值的中间值。

迭代算法:

  1. 选择一个初始阈值T0;
  2. 根据阈值T0将图像分为A和B两部分。分别求出A和B的平均灰度值A_average和B_average。
  3. 计算 T1= (A_average+B_average)/2 ,比较 abs(T1-T0)<1(或更小值),若果成立,则停止迭代,此时的T1就是分割阈值;否则,将T1赋值给T0(T0=T1),继续从第二步开始。

算法实现:

A = imread('rice.png');
figure;
subplot(121);imshow(A);title('原图')
T = mean2(A);   %取均值作为初始阈值
done = false;   %定义跳出循环的量
i = 0;
% while循环进行迭代
while ~done
    r1 = find(A<=T);  %小于阈值的部分
    r2 = find(A>T);   %大于阈值的部分
    Tnew = (mean(A(r1)) + mean(A(r2))) / 2;  %计算分割后两部分的阈值均值的均值
    done = abs(Tnew - T) < 1;     %判断迭代是否收敛
    T = Tnew;      %如不收敛,则将分割后的均值的均值作为新的阈值进行循环计算
    i = i+1;
end
A(r1) = 0;   %将小于阈值的部分赋值为0
A(r2) = 1;   %将大于阈值的部分赋值为1   这两步是将图像转换成二值图像

subplot(122);imshow(A,[]);title('迭代处理后')

处理结果:

在这里插入图片描述
该算法实现的处理结果,还是比较理想的。

2018-08-10 23:26:33 ml_ai_sun 阅读数 8947
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

近段时间再学习图像分割,我会更新一些基础的图像分割方法,比较常用的我会附上matlab代码,希望和大家一起学习进步。

1. P-tile法

  一般用于灰度图像,使用条件是已知目标在政府图像中所占的面积比为P%,先得到图像的灰度直方图,然后从小到大累加,直到为P%,记录当前灰度,以它为阈值来分割图像。条件很苛刻,大部分情况下都用不上。

2.双峰法 

要求目标图像和背景图像的灰度级有着明显的区别,并且该图像的灰度直方图有较明显的双峰。分割图像的直方图的双峰分别代表目标图像和背景图像,而波谷代表着分割图像的边缘。
matlab有findpeaks()函数帮助我们来找到峰值:

findpeaks函数参数有很多,这里只是简单的介绍:
[pks, locs] = findpeaks(data);
输出是每个峰值的数值及其横坐标
findpeaks(data);
系统输出峰值图线
[...] = findpeaks(data,'minpeakheight',mph)----mph 设定峰值的最小高度
[...] = findpeaks(data,'minpeakdistance',mpd)----mpd 设定两峰值间的最小间隔数

除了findpeaks函数,还有方法可以找到波峰和波谷:

IndMin=find(diff(sign(diff(data)))>0)+1;
IndMax=find(diff(sign(diff(data)))<0)+1;
IndMin, data(IndMin)对应的是波谷点的数据
IndMax,data(IndMax)对应的是波峰点的数据

注:
这里介绍一下diff()和sign()



 

sign(x)
当x<0时,返回-1
当x=0时,返回0
当x>0时,返回1

接下来我们就开始试验用一下双峰法来将图像二值化吧:
f = imread('1.jpg');
f_gray = rgb2gray(f);
% imshow(f_gray);
f_h = imhist(f_gray);
% disp(max(imhist(f_gray)));
MinPeakHeight = max(f_h)/4;
[a, b] = findpeaks(f_h, 'MinPeakDistance',8,'MinPeakHeight',MinPeakHeight, 'NPeaks', 8);
[max_1, c] = max(a);
a(c) = 0;
[max_2, d] = max(a);
T = ceil(0.5*(b(c) + b(d)))/255;
f_gray = mat2gray(f_gray);
f_bw = im2bw(f_gray, T);
% imshow(f_bw);

(下面一排左边是灰度图像的直方图,右边是提取到的峰值图片)

利用findpeaks函数来处理这种峰值不是很明显的图片效果不怎么好。

 

结束语:冈萨雷斯这本书我刚刚开始看,可能会有一些理解不正确的地方,希望大家能够在我文章

下留言,帮我改正。另外想要和我一起自学的小伙伴,可以加我的微信号:13027158275

或者加入数字图像处理交流QQ群:709538582

 

2018-04-23 16:31:31 u010936286 阅读数 354
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

前面两节介绍了图像的空间操作,包括图像的缩放旋转,图像的加减乘除及其应用。这里主要介绍图像的灰度变换。

图像的灰度变换是在图像的单个像素上操作,主要是以对比度和阈值处理为目的。因此,这里的灰度变换是在空间域中进行的。

图像反转

图像反转通过反转图像的灰度值,得到照片底片,以使得当黑色面积占主导地位时,通过该操作来增强图像中的白色或灰色细节。其可以通过下面的公式表示。其中r为原图像灰度值,L为图片的灰度级,当图片数据格式为uint8时,L=256s为反转后的像素值。


Matlab实现代码如下,imadjust用来对图像进行灰度变换。其语法是g=imadjust(f,[low_in high_in],[low_out high_out],gamma),其中f为原图像灰度数据,[low_in high_in],[low_out high_out]表示将low_inhigh_in之间的值映射到[low_out high_out]。该值取值范围为[0,1]实际根据数据格式乘以相应的灰度级。例如当数据为uint8[0,1]相当于[0,255]。

Breast=imread('原始数字乳房X射线照片.jpg');
Breast_gray=rgb2gray(Breast);
g1=imadjust(Breast_gray,[0,1],[1,0]);

figure(1)
subplot(1,2,1)
imshow(Breast_gray)
title('原始数字乳房X射线照片')
subplot(1,2,2)
imshow(g1)
title('反转后照片')

执行上述程序,我们可以得到下图。原图像是一幅数字乳房X射线照片,其中显示有一小块病变。通过反转操作,我们可以很清晰方便的观察到该病变位置。


图像对数变换

图像的对数变换可以用下列公式表示:



图像的对数变换可以将输入范围较窄的低灰度值映射到输出较宽范围的灰度值。通过该操作,我们可以扩展图像中的暗像素的值,同时压缩高灰度级的值。


例如在对图像进行频谱分析时,由于原始相机通过感光元件可以获得0~10^6频谱范围,甚至更高,尽管计算机可以处理这一范围的数字,但是图像的显示系统往往不能如实的刻画如此大范围的灰度值,因此导致许多灰度细节在傅里叶频谱显示中丢失。而解决该问题的方法之一就是改线性横坐标为对数坐标。

Matlab代码如下,这里由于需要将原图像数据进行对数计算,因此首先将数据格式变为double,其次通过mat2gray函数,将其函数值映射到[0,1]范围内,再通过im2uint8将数据映射为uint8格式,即为[0,255]。

fft_data=imread('傅里叶频谱.jpg');
g=im2uint8(mat2gray(log(1+double(fft_data))));
figure(1)
subplot(1,2,1)
imshow(fft_data)
title('傅里叶频谱')
subplot(1,2,2)
imshow(g)
title('对数变化后图像')

我们可以看到原始傅里叶变换频谱由于范围很宽(0~1.5×10^6),导致在显示系统中进行线性缩放显示时,最亮的像素支配整个图像,频谱的低值将损失掉。这里通过图像的对数操作,我们可以看到更多的低频点的细节。



图像幂律(伽马)变换

图像的幂律(伽马)变换可以用下面的公式表示:



其中c和γ为正常数。与对数变换相类似,图像的幂律(伽马)变换对于不同的γ取值会使得原图像的灰度伸展或压缩。



我们可以看到,当0<γ<1时,较窄的暗色低灰度值映射到较宽范围的输出值,较高灰度值则映射到较窄的输出范围。而当γ>1时则于此相反。

伽马变换常用于由于图像获取、打印和显示的设备不同而进行的伽马校正和对比度增强等。

spinal_cord=imread('人体脊髓骨折的核磁共振图像.jpg');
g=im2uint8(mat2gray(double(spinal_cord)).^0.4);
figure(1)
subplot(1,2,1)
imshow(spinal_cord)
title('人体脊髓骨折的核磁共振图像')
subplot(1,2,2)
imshow(g)
title('幂律变换后图像')

如图为γ=0.4的幂律变换前后图像。可以看到对低灰度值的暗区域得到了提升。

这里以一张航拍图为例,选择γ=3.

spinal_cord=imread('航拍图.jpg');
g=im2uint8(mat2gray(double(spinal_cord)).^3);
figure(1)
subplot(1,2,1)
imshow(spinal_cord)
title('航拍图')
subplot(1,2,2)
imshow(g)
title('幂律变换后图像')

运行上述代码,可以看到通过幂律变换将高灰度值的输入映射到较窄的范围内输出,可以很清晰的观察出航拍效果图。


2018-02-23 21:22:51 revitalise 阅读数 1697
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

在此用矩形连通域为例

当获取车牌位置信息时,连通域的长宽比是一种非常有效的辅助定位方法。

大致步骤:

1.输入图像获取灰度图像。

2.选取合适的阈值将灰度图像转化为二值图像。

3.对二值图像进行形态学处理,主要任务是去除连通域面积较小的区域以及降低筛选难度。

4.利用bwlabel()函数对连通区域进行标记

5.得到连通域的长宽比


matlab实现程序:

clear all;close all;clc
I= imread('F:\matlab\MATLAB上机操作\源代码\Fig0903(a)(utk).tif');
I = rgb2gray(RGB);
threshold = graythresh(I);
bw = bwareaopen(bw,50);%去除连通域面积小于50的区域(连通域面积与对象的像素数目不一定相等)
se = strel('disk',2);
bw = imclose(bw,se);%闭运算
bw = imfill(bw,'holes');%填充
ed=edge(bw);
L = bwlabel(bw);%标记连通域
L1 = bwlabel(ed);
p=zeros(1,max(L1(:)));
for i=1:max(L(:))%得到连通域的长宽比
p(i)=sum(ed(L==i));
[y,x]=find(L==i);
x0=min(x(:));
x1=max(x(:));
y0=min(y(:));
y1=max(y(:));
bl=(x1-x0)/(y1-y0);
disp(bl)
end


图像填充imfill()

bw2=imfill(bw)该函数对二值图像进行填充操作,对于二维图像允许通过鼠标选择填充的点。

[bw2,locations]=imfill(bw)  locations包含交互式选择时的点坐标。

bw2=imfill(bw,’holes’)通过参数holes可以填充二值图像的空洞。

连通域标记bwlabel()

L=bwlabel(bw,n)该函数先对二值图像的连通区域进行标记,参数n为联通类型,可取值48,默认为8,即为8连通,函数返回值为标记矩阵和原来的二值图像有相同的大小

[l,num]=bwlabel(bw,n)  num为连通域的数目。

Bwlabel()返回的标记矩阵可以通过函数label2rgb()进行显示。


2019-04-25 08:48:52 kuizhao8951 阅读数 153
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

这里的内容是之前黄学姐没有整理的,同样声明:以下内容没考到概不负责。

 

目录

Marr边缘检测方法

基于直方图阈值的图像分割中,最佳阈值是如何选取?

图像特征提取,位置与方向,长轴与短轴,周长,面积,距离矩形度,宽长比,圆形度,球状度,偏心率

位置与方向:

长轴和短轴:

周长:

面积:

距离:

矩形度:

宽长比:

圆形度:

球状度:

偏心率:

特征的距离测量: 欧几里得,棋盘,市区距离分别是什么样的?

8方向链码, 起点的归一化,旋转的归一化

二值图像形态学运算是基于什么进行操作的。

形态学中,结构元的概念。

膨胀、腐蚀、开、闭运算的符号、算法规则、运算效果。

以下是第九章数学形态学的内容。

击中击不中变换(重点~~)

边缘提取算法

区域填充算法

连接区域提取算法

凸壳运算

细化运算


 

 

Marr边缘检测方法

 

边缘检测使用的算子有梯度算子,罗伯特算子,Sobel算子,拉普拉斯算子等。梯度和拉普拉斯对噪声比较敏感。故提出两种改进方法1.先平滑抑噪后微分2.先对图像局部线性拟合,后直接用拟合函数导数替代数值导数,如曲面拟合法。

Marr边缘检测就是前者的一种: 

一  : h(x)为平滑滤波器:要满足一下三个条件:

(1)当为偶函数; (2) ; (3)一阶、二阶可微

二: Marr提出用拉普拉斯(计算简单)替代二阶导数

基于直方图阈值的图像分割中,最佳阈值是如何选取?

最佳阈值:是指使图像中目标物和背景分割错误最小的阈值。 设一幅图像由目标物和背景组成,已知灰度分布概率密度分别为P1(Z)和P2(Z),目标物像素占全图像像素比是\theta。假定选用的灰度级阈值为Z_{t},总的错误概率为

求导,并令其等于零,得解

例子:一幅图像是由背景和物体组成,假设:

物体像素灰度级具有正态概率密度p(z),均值方差为(\mu ,\sigma ^{2})

背景像素灰度级具有正态概率密度q(z),均值方差为(\nu ,\tau^{2})

物体占图像总面积的比为\theta,背景占总面积的比为1-\theta,所以这幅图像总的灰度级概率密度为 \theta p(z)+(1-\theta)q(z)

设一阈值T,并且把小于T的全部点称为目标物体点,而把大于等于T 的所有点称为背景点。

把背景错归为物体点的概率为Q_{1}(t),把物体点错归为背景点的概率为Q_{2}(t),则有

要求得上式的最优阈值,可将上式对t 微分,并令其结果为0,则得到

又因为

 

 

下面是图像表示与描述内容

图像特征提取,位置与方向,长轴与短轴,周长,面积,距离矩形度,宽长比,圆形度,球状度,偏心率

位置与方向:

位置(质心公式)\left\{\begin{matrix} \bar{x} =\frac{1}{NM}\sum_{N-1}^{i=0}\sum_{M-1}^{j=0}x_{i}\\ \bar{y} =\frac{1}{NM}\sum_{N-1}^{i=0}\sum_{M-1}^{j=0}y_{i} \end{matrix}\right.  ;方向(将较长方向的轴定义物体的方向)【通常,将最小二阶矩轴定义为较长物体的方向。也就是说,要找出一条直线,使物体具有最小惯量,即:r是点(x,y)到轴线的垂直距离】

长轴和短轴:

方框为MER最小外接矩形。

周长:

是指该物体或区域的边界长度。三种计算方法:

  1. --》周长为24
  2. (八链码)链码表示:
  3. 周长即物体边界点数之和,其中每个点为占面积为1的一个小方块。,周长15

面积:

  1. 最简单的面积计算方法是统计边界及其内部的像素的总数
  2. 用格林公式(二重积分变沿闭区域边界的曲线积分)面积

距离:

特征的距离测量: 欧几里得,棋盘,市区距离分别是什么样的?

矩形度:

指物体的面积与其最小外接矩形的面积之比值。

宽长比:

是指物体的最小外接矩形的宽与长之比值。

圆形度:

包括周长平方面积比、边界能量、圆形性、面积与平均距离平方之比值等。圆形度可以用来刻画物体边界的复杂程度。

  1. 周长平方面积比:
  2. 边界能量:r是曲率半径                              
  3. 圆形性:圆形最大 =从区域重心到边界点的平均距离 =从区域重心到边界点的距离均方差
  4. 球状度:内切圆半径与外切圆半径的比值

球状度:

 以上

偏心率:

又称伸长度,反映了一个区域的紧凑性。长轴(主轴)长度与短轴(辅轴)长度的比值。

E=A/B

特征的距离测量: 欧几里得,棋盘,市区距离分别是什么样的?

 

  1. 欧几里得距离
  2. 市区距离
  3. 棋盘距离:

8方向链码, 起点的归一化,旋转的归一化

上面图有错(计算周长的八链码),左图是真正的八链码

起点归一化就是取最小的码作为结果的首个方向。

旋转归一化就是采用一阶差分(1个表示原链码各段之间方向变化的新序列)作为新的码。

设原来的链码为:Cn=a0 a1 a2 a3....an-1  N=4or8        那么一阶差分码为:dCn = b0 b1 b2 ...bn-1     N=4or8

b0=[(a0-an-1)+N] MOD N    bi=[(ai-ai-1)+N] MOD N

盗图为例:原码(左)10103322                (右)21210033

4方向的差分: [(1-2)+4]%4=3  [(0-1)+4]%4=3  [(1-0)+4]%4=1 以此类推都是33133030

 

下面是形态学原理内容

二值图像形态学运算是基于什么进行操作的。

二值形态学中的运算对象是集合。

形态学中,结构元的概念。

结构元就是形态学操作中涉及到的一个关键的因子。结构元就是一个形状和大小已知的像素点集,通常还要为结构元定义一个中心。

膨胀、腐蚀、开、闭运算的符号、算法规则、运算效果。

膨胀:

规则:S来膨胀X得到的集合是S包括(部分/完全)在X中时S的原点位置的集合。

效果:

  • 腐蚀:
  • 规则:S来腐蚀X得到的集合是S完全包括在X中时S的原点位置的集合。
  • 效果:

开启运算:

规则:A开B的边界为B在A内滚动所能达到的最远处的B的边界所构成。

效果:

开运算一般能平滑图像的轮廓,削弱狭窄的部分,去掉细的突出。(先腐蚀后膨胀)

闭合运算:

规则:A闭B的边界为B在A边界外边滚动最近所能不能达到的边界所构成。

效果:

闭运算也是平滑图像的轮廓,与开运算相反,它一般熔合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。(先膨胀后腐蚀)

 

参考好博文:数学形态学运算——腐蚀、膨胀、开运算、闭运算

 

 

以下是第九章数学形态学的内容。

数学形态学处理一般都是不可逆的,无法重构,有信息损失。

形态学运算性质:

性质1.递增性(处理之后仍满足包含关系)

性质2.幂等性(处理几次,结果都等效)

Q:为什么上面的膨胀定义没有翻转而数学形态学膨胀有翻转后才平移

膨胀:=-->B先翻转后平移x,交集不为空集的x的集合为结果。

腐蚀:平移后包含其中的x的集合

开运算一般能平滑图像的轮廓,削弱狭窄的部分,去掉细的突出。(先腐蚀后膨胀)

A开B的边界为B在A内滚动所能达到的最远处的B的边界所构成。

闭运算也是平滑图像的轮廓,与开运算相反,它一般熔合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。(先膨胀后腐蚀)

A闭B的边界为B在A边界外边滚动滚动所能不能达到的地方所构成。

击中击不中变换(重点~~)

数学形态学的核心:HMT:HitMissTransfer:形状检测基本工具~

HMT是一个完全的模板匹配过程。

击中:找出满足模版的前景

击不中:找出满足模版的背景 两者的交集就是一个完全的模板匹配过程。

如果B记为由X和其背景构成的集合,B在A中的匹配,记为,则

边缘提取算法

集合A的边界记为 \beta (A),可以通过下述算法提取边缘:

区域填充算法

连接区域提取算法

随便找一个图形内的点P 

膨胀后被原图包含的部分继续膨胀被包含,最后收敛的结果

     

例子:

凸壳运算

如果连接集合A内任意两点的直线段都在A的内部,则A是凸形的。

通俗说就是四个结构元分别不断和原图HMT之后与原图并集的收敛结果。

然后其他方向再搞三次,成这样

缺点是: 凸壳可能超出确保凸性所需的最小尺寸

细化运算

集合A被结构元素B的细化用表示,根据击中(hit)(或击不中miss)变换定义:

更有用的表达是基于结构元素 序列的:

细化表达式为untill 整个过程重复进行到没有进一步的变化发生为止。

For example:

结构元素序列


粗化的结构元素同细化的结构元素具有相同的形式。只是所有的0和1交换位置。 通常采用细化集合的背景,然后求补而达到粗化的结果。

为了粗化集合A,我们先令,细化C,然后得到 即为粗化结果。

 

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