2016-08-04 20:20:03 hhw999 阅读数 1046
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

 
指定任意灰度变换



用一个指定的变换函数来变换一幅图像的灰度:
     令T表示一个列向量,其包含该变换函数的值,例如:在一幅8比特图像的情况下,T(1)是由输入图像中的0灰度值映射来的值,T(2)是由1灰度值映射来的值,以此类推,T(256)是由255映射来的值

     使用取值范围为【0 1】的浮点数来表示输入图像和输出图像,可以简化程序

     实现灰度映射的一种简单方法:函数interp1
               g=interp1(z,T,f),其中f是输入图像,g是输出图像,T是上述的列向量,z是长度与T相同的列向量
          
                   z的形成:z=linspace(0,1,numel(T)),机制:函数linspace(a,b,n)会生成一个行向量,该行向量的n个元素是在a和b之间(包括a和b)线性间隔的
                              
                    机制:对于f中的一个像素值,interp1首先寻找横坐标的值(z),然后,寻找(内插)T中的相应值,并将寻找(内插)的值输出到g中的相应像素位置
                                                 
                    例如,假定T是负变换,T=【1,0】(T(1)由f的0灰度值来映射,T(2)由f的1灰度值来映射),则z=【0,1】,假定f中的一个像素由值0.75,则在g中相应的像素将被赋值为0.25

                  内插是必要的,因为对于T仅有给定数量的离散点,而r(输入图像的灰度)在【0 1】范围内有任意值

                         内插是数学领域数值分析中的通过已知的离散数据求未知数据的过程或方法。
                         科学和工程问题可以通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的函数(也就是曲线)或者
                         更加密集的离散方程与已知数据相吻合。这个过程叫做拟合。内插是曲线必须通过已知点的拟合。

     
2019-05-19 15:23:08 nanhuaibeian 阅读数 187
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

一、指定任意灰度变换

如果需要使用一个指定的变换函数来变换一幅图像的灰度,
可使用函数imterplg = interpl(z,T,f)
其中,f 是输入图像,g 是输出图像,T是一个列向量(包含该变换函数的值),
z 是长度与 T 相同的列向量 z = linspace(0,1,numel(T))';

函数linspace(a,b,n):生成一个行向量,该行向量的n个元素是在a和b之间(包括a和b)线性间隔,该函数还可认为是执行查找的操作

对于 f 中的一个元素值,interpl首先寻找横坐标的值(z)。然后寻找(内插)T中的相应值,并将内插的值输出到g中的相应元素位置。

示例:
如果 T 是负变换,T = [1 0]',因为 T 仅由两个元素,z = [0 1]'
假定 f 中的一个像素有值 0.75,则在 g 中相应的像素将被赋值为 0.25
由于对于T仅有给定数量的离散点,而r在[0 1]范围内有任意值,所以内插是需要的

二、用于灰度变换的一些实用M函数

  1. 处理可变数量的输入和/或输出
    函数 nargin::n = nargin,返回输入到M函数的参量的实际数量
    函数 nargoutn = nargout,用于M函数的输出
T = testhv(4,5);
//如果使用nargin返回2,使用nargout返回1

函数nargchkmsg = nargchk(low,high,number)
用于一个M函数体中,以检测传递的参量数目是否正确
该函数在number小于low时,返回消息 Not enough input parameters;
该函数在number大于high时,返回消息 Too many input parametere
该函数介于low与high之间,则函数nargck返回一个空矩阵
该函数输入参量不正确时,则频繁使用函数nargchk可通过函数error来终止程序的执行

函数varargin和varargout:声明必须使用小写形式

function [m,n] = testhv3(varargin);
function [m,n] = testhv3(varargout);
//若函数testhv3仅有一个固定的参量x,其后跟可变数量的输入参量
function [m,n] = testhv3(x,varargin);//当调用此函数时,varargin由用户提供的第二个输入参量开始执行

一组混合的输入:[m,n] = testhv3(f,[0 0.5 1.5],A,'label');

二、另一种用于灰度变换的M函数

  1. 函数changeclass:g = changeclass(newclass,f) (自定义的M函数)
    此函数将图像 f 转换成由参数 newclass 指定的类别,并输出图像 g。
    newclass的有效值为uint8/uint16/double

  2. 函数tofloat:[g,revertclass] = tofloat(f) (自定义的M函数)
    该函数通过适当地比例因子,把一幅logical类/uint8类/uint16类或int16类的图像变换成single类的图像
    如果 f 是double或single类的图像,则 g = f

  3. intrans 的 M 函数
    varargin是一个单元数组,接收可变数量的输入,所以其元素应使用大括号括起

% 灰度变换
function g = intrans(f, method,varargin)

% Verify the correct number of inputs.
% msg = nargchk(low,high,number),number控制在 low 和 high之间
error(nargchk(2, 4, nargin))

if strcmp(method,'log') % 对数变换
    g = logTransform(f,varargin{:});
    return;
end

if isfloat(f) && (max(f(:))>1 || min(f(:))<0)
    f = mat2gray(f);    % 归一化限制范围
end

% Store class of f for use later
[f,revertclass] = tofloat(f);

% 执行指定的灰度变换 
switch method
case 'neg'  % 将灰度图像反转,图像负片
   g = imcomplement(f); 

case 'gamma'    % 由图像 f 映射生成图像 g 的曲线的形状
  g = gammaTransform(f,varargin{:});
   
case 'stretch'  % 对比度拉伸变换
  g = stretchTransform(f,varargin{:});

case 'specified'    % 指定灰度变换
    g = specifiedTransform(f,varargin{:});
  
otherwise
   error('Unknown enhancement method.')
end

% Convert to the class of the input image.
g = revertclass(g);

%-------------------------------------------------------------%
function g = gammaTransform(f,gamma)
%对图像进行灰度变换
g = imadjust(f,[],[],gamma);

%-------------------------------------------------------------%
function g = stretchTransform(f,varargin)
% 实行对比度拉伸变换
if isempty(varargin)    % 如果varargin是一个空数组
    % Use defaults.
    m = mean2(f);   % 调用内部计算f的平均值
    E = 4.0;
elseif length(varargin) == 2    % 给m 和 E 赋值
    m = varargin{1};
    E = varargin{2};
else
    error('Incorrect number of inputs for the stretch methon.')
end
g = 1 ./(1 + (m ./ (f + eps)) .^E);

%-------------------------------------------------------------%
function g = specifiedTransform(f,txfun)
% 指定灰度变换
% f is floating point with values in the range [0 1].
% 强制它成为列向量
txfun = txfun(:); % Force it to be a column vector.
if any(txfun) > 1 || any(txfun) <= 0
        error('All elements of txfun must be in the range [0 1]')
end
T = txfun; % T为包含该变换函数值的列向量
z = linspace(0,1,numel(T)); % 长度与 T 相同的列向量
g = interpl(z,T,f);

%-------------------------------------------------------------%
function g = logTransform(f,varargin)
% 执行对数变换
[f,revertclass] = tofloat(f);   % Store class of f for use later
if numel(varargin) >= 2 % 第一个是C值,第二个为图像类
    if strcmp(varargin{2},'uint8')
        revertclass = @im2uint8;    % 声明一个句柄
    elseif strcmp(varargin{2},'uint16')
        revertclass = @im2uint16;
    else 
        error("Unsupport CLASS option for 'log' method. ")
    end
end
if numel(varargin) < 1
    % Set default for C.
    C = 1;
else
    C = varargin{1};    % 已经定义了C的值
end
g = C * (log(1+f));
g = revertclass(g);  % 将输出转换为与f相同的类

运行:

>> g = intrans(f,'stretch',mean2(tofloat(f)),0.9);
>> imshow(f),figure,imshow(g)

这里函数mean2可以直接计算f的平均值
由于使用 tofloat 把图像 f 转换成了浮点类图像,从而使平均值m也在此范围内,E的值也就去确定了
在这里插入图片描述

  1. 函数gscale:将图像标度在全尺度
    语法格式:g = gscale(f,method,low,high)
    在这里插入图片描述
2018-03-18 14:31:25 qq_27591163 阅读数 516
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

图像的灰度变换是图像的一种点处理算法,指图像任意点的增强仅仅依赖于该点的灰度值。而在下一节将会使用的是图像的模板变换。

1.图像的反转变换

灰度级为[0,L-1]则:反转变换为:g(x,y)=L-1-f(x,y)

其中g(x,y)位输出图像,f(x,y)为输入图像。

2.图像的对数变换

此种变换使一窄带低灰度输入图像转换映射为一宽带输出图像:

y = a + log(1+x)/b

其中a控制曲线的垂直偏移量,b控制曲线的弯曲程度,b越大则曲线越弯曲。

3.图像的幂次变换:

y = cx**r + b

其中c,r均为正数,使x与y的取值均在0-255则;

y = 255c(x/255)**r+b

幂次变换的性质为:

当r<0时,变换函数曲线在正比线上方,此时与对数函数类似,使图像变亮

当r>0时,变换函数曲线在正比线下方,此时扩展高灰度级,压缩低灰度级,使图像变暗。

4.灰度均衡化

灰度均衡化的公式推导涉及到了微积分的知识,均衡化的作用是使一副图像其像素占有全部可能的灰度级并且分布均匀,则这样的图像有高对比度和多变的灰度色调。

{
	float newMi[256];
	LPBYTE p_data = getData();
	int width = getWidth();
	int height = getHeight();
	LPBYTE temp = new BYTE[width*height];
	memcpy(temp, p_data, width*height);
	int bMap[256];
	newMi[0] = midu[0];
	for (int i = 1; i < 256; i++) {
		newMi[i] = newMi[i - 1] + midu[i];
	}
	for (int i = 0; i < 256; i++)
	{
		bMap[i] = (int) (newMi[i] * 255.0 + 0.5f);//这里后边的式子一定要括起来因为强制类型转换的优先级要高
	}
	for(int j=0;j<height;j++)
		for(int i=0;i<width;i++)
		{
			BYTE T = temp[width*j+i];
			temp[width*j+i] = bMap[T];
		}
	memcpy(p_data, temp, width*height);
}

2018-04-27 15:18:51 qq_39227338 阅读数 728
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

第二章 灰度变换与空间滤波

  • 灰度变换函数
    • 函数imadjust和stretchlim
    • 对比及对比度拉伸变换
    • 指定任意灰度变换
    • 实用的M函数
  • 直方图处理与函数绘图
    • 生成并绘制图像直方图
    • 直方图均衡
    • 直方图匹配(规定化)
    • 函数adapthisteq
  • 空间滤波
    • 线性空间滤波
    • 非线性空间滤波
  • 图像处理工具箱的标准空间滤波器
    • 线性空间滤波器
    • 非线性空间滤波器

一.灰度变换函数

g(x, y) = T[f(x, y)]

(x, y)处的g值仅有f在该点的灰度决定,T也变为亮度或灰度函数。在处理单色图像时,这两个术语可以相互换用。在处理彩色图像时,亮度用于表示某些色彩空间中的一个彩色图像分量。

函数imadjust和stretchlim
  • 灰度级图像进行灰度变换

    g = imadjust(f, [low_in high_in], [low_out high_out], gamma)


[low_in high_in]之间的值映射到[low_out high_out]之间。 若gamma
>> g1 = imadjust(f, [0 1], [1 0]);
>> imshow(g1);
>> g = imcomplement(f);
>> imshow(g);

图像f(原图)
这里写图片描述
图像g、g1
image

imadjust(f, [0 1], [1 0])
imcomplement(f)
两个函数都能表示图片的负片

>> g3 = imadjust(f, [], [], 0.5);
>> imshow(g3);
也可以直接改变gamma值
>> g3 = imadjust(f, stretchlim(f), []);
>> imshow(g3);

g3图片,stretchlim(f)函数实现了对比度拉伸,默认情况下提升了对比度。
这里写图片描述

对数及对比度拉伸变换
对比度拉伸就是把窄范围的输入灰度级扩展为宽范围的输出灰度级。以我自己的理解就是使对比效果更加明显,形成了一幅高对比度的图像。 - 执行对数变换的函数

gs = im2uint8(mat2gray(g));

在MATLAB中函数对浮点图像实现的方法就是借助公式*g = 1 ./ (1 + (m./f) .^ E)*
>> g = im2uint8(mat2gray(z));
>> gs = im2uint8(mat2gray(log(1 + double(z))));
>> imshow(gs);
>> figure, imshow(g);

这里写图片描述
image

指定任意灰度变换
实现灰度映射可以使用函数

g = interp1(z, T, f)

T为列向量,z是长度与T相同的列向量,使用下面方法实现

z = linspace(0, 1, numel(T));

==使用取值范围为[0 1]的浮点数来表示输入和输出图像会大大简化程序==
实用的M函数
  • 检测输入到M函数的参数数目
    n = nargin
  • 检测函数的输出参数数目
    n = nargout
  • 检测传递的参数的数量是否正确
    msg = nargchk(low, high, number)
  • 具有可变个数的输入和输出变量
    一般在写函数的时候我们时常会遇到不确定参数的时候,可以使用varargin和varargout.
function [m, n] = testhv3(varargin)
function [varargout] = testhv4(m, n)
%可以有一个固定的输入参数,后面跟随可变数量的输入参数
function [m, n] = testhv3(x, varargin)
  • 另一种用于灰度变换的M函数
    1.intrans.m
    2.gammaTransform.m
    3.stretchTransform.m
    4.spcfiedTransform.m
    5.logTransform.m
    以上五个函数结合使用
>> g = intrans(f, 'stretch', mean2(im2double(f)), 0.9);
>> figure, imshow(g);

实现灰度变换
- 灰度标定的函数

function g = gscale(f, varargin)
if length(varargin) == 0
    method = 'full8';
else
    method = varargin{1};
end

if strcmp(class(f), 'double') && (max(f(:))>1 || min(f(:))<0)
   f = mat2gray(f);
end

switch method
    case 'full8'
        g = im2uint8(mat2gray(double(f)));
    case 'full16'
        g = im2uint16(mat2gray(double(f)));
    case 'minmax'
       low = varargin{2};high = varargin{3};
       if low>1 | low<0 | high>1 | high<0
             error('Parameters low and high must be in the range [0,1]')
       end
       if strcmp(class(f), 'double')
            low_in = min(f(:));
            high_in = max(f(:));
       elseif strcmp(class(f), 'uint8')
            low_in = double(min(f(:)))./255;
            high_in = double(max(f(:)))./255;
       elseif strcmp(class(f), 'uint16')
            low_in = double(min(f(:)))./65535;
            high_in = double(max(f(:)))./65535;
       end

       g = imadjust(f,[low_in high_in],[low high]);
otherwise
       error('Unknown method')
end

调用以下语句

g = gscale(f, method, low, high)

method可以的有效值是‘full8’(默认)、‘full16’和‘minmax’。

二.直方图处理与函数绘图

生成并绘制图像直方图
h(rk) = nk

rk是区间[0,G]内第k级灰度

nk是出现rk的像素数

p(rk) = h(rk) / n = nk / n

p(rk)是灰度级rk出现的概率估计

  • 直方图的imhist方法

处理直方图有一个核心函数

h = imhist(f, b);

b是用来形成直方图“容器”的数目(若b未包含在此参量中,其默认值为256)。

>> imhist(f);

image

==一个容器只是灰度范围的小部分,b就是将256个级别分为b个部分==

归一化直方图的方法:
p = imhist(f, b) / numel(f)
- bar方法

>> h = imhist(ff, 25);
>> horz = linspace(0, 155, 25);
>> bar(horz, h)
>> axis([0 255 0 60000])
>> set(gca, 'xtick', 0:50:255)
>> set(gca, 'ytick', 0:20000:60000)
>> figure, imshow(h);
>> figure, imshow(ff);

image

==linspace(x1,x2,N)==

功能:linspace是Matlab中的均分计算指令,用于产生x1,x2之间的N点行线性的矢量。其中x1、x2、N分别为起始值、终止值、元素个数。若默认N,默认点数为100。

==axis([horzmin horzmax vertmin vertmax])==

功能:设定水平和垂直轴的范围

set(gca, ‘xtick’, 0:50:255)

意思是将x轴设定为从0开始每次增加50,直到增加到255,设定也y轴同理。

  • stem方法
>> h = imhist(f, 25);
>> horz = linspace(0, 255, 25);
>> stem(horz, h, 'fill')

image
- plot方法

>> hc = imhist(ff);
>> plot(hc)
>> axis([0 255 0 15000])
>> set(gca, 'xtick', [0:50:255])
>> set(gca, 'ytick', [0:2000:15000])

image

==set中的gca是用来返回当前axes (坐标图)对象的句柄,也就是返回了一个坐标图像。==

ylim(‘auto’)
xlim(‘auto’)

自动设定符合条件的x, y的范围。也可以手工设定,同下。

ylim([ymin ymax])
xlim([xmin xmax])

  • 处理函数句柄的绘图函数

    fplot(fhandle, limits, ‘LineSpec’)


limits是指定函数x轴的取值范围(xmin, xmax)的一个向量,’LineSpec’是绘制图像的符号。
>> fandle = @sin

fandle =

  function_handle with value:

    @sin

>> fplot(fandlw, [0 6], ':')

image

在0到6之间绘制了一个正弦函数图像。

也可以通过其他函数来美化图像

>> fandle.LineStyle = ':';
>> fandle.Color = 'r';
>> fandle.Marker = 'x';
>> fandle.MarkerEdgeColor = 'b';

image

直方图均衡
  • 直方图均衡函数

    g = histeq(f, nlev)


nlev是为输出图像直方图设定的灰度级数
,函数中默认nlev = 64, 一般灰度级会分为256级。
>> f = Fig0208;
>> imshow(f);
>> figure, imhist(f);
>> ylim('auto')

这是原始图像及它的直方图
image

image

进行直方图均衡后

>> g = histeq(f, 256);
>> figure, imshow(g);
>> figure, imhist(g);
>> ylim('auto')

image

image

直方图累加求和列出了灰度变化的整个过程
(cumsum函数是表示累加求和,比如

A = 1:5;

B = cumsum(A)

B = 1 3 6 10 15)

>> hnorm = imhist(f) ./ numel(f);
>> cdf = cumsum(hnorm);
>> x = linspace(0, 1, 256);
>> plot(x, cdf)
>> axis([0 1 0 1])
>> set(gca, 'xtick', 0:.2:1)
>> set(gca, 'ytick', 0:.2:1)
>> xlabel('Input intensity values', 'fontsize', 9)
>> ylabel('Output intensity values', 'fontsize', 9)

image

==可以使用窗口中的Insert来修改插入图形==

直方图匹配(规定化)
  • 直方图匹配函数
    g = histeq(f, hspec)
>> imshow(f);
>> figure, imhist(f);
>> g = histeq(f, 256);
>> figure, imshow(g);
>> figure, imhist(g);

image

image

在给定工具箱函数中灰度级移到较高端,但是还是给出了一幅低对比度且有褪色的图像。从原始图中看出灰度级在0及其附近过于集中。有直方图得到的累计变换函数很陡,因此把低端过于集中的像素点映射到了灰度级的高端。

利用直方图匹配能够补救这一现象。
- 直方图匹配增强

>> g = histeq(f, p);
>> imshow(g);
>> figure, plot(p);
>> ylim('auto')
>> figure, imhist(g);

image

image

image

函数adapthisteq

这一函数执行所谓的对比度受限的自适应直方图均衡,也就是用直方图匹配的方法来逐个处理图像中的小区域(小片),再将相邻小片结合起来,从而==消除人工引入的边界==。

g = adapthisteq(f, param1, val1, param2, val2…)

param / val是表中内容

image

>> g1 = adapthisteq(f);
>> g2 = adapthisteq(f, 'NumTiles', [25 25]);
>> g3 = adapthisteq(f, 'NumTiles', [25 25], 'ClipLimit', 0.05);

由图中可以看出,局部增强方法好于全局增强,但是额外的代价是函数的复杂性增加。

image

三.空间滤波

线性空间滤波
线性操作理解:对于一个3 x 3的滤波器,所有滤波器上的系数乘以对应点的像素,所有结果求和,得到的就是图像中3 x 3的中心的响应。 图像和模板在处理的时候有一些点是没有重叠的,要对f填充足够且必要的0,以保证模板w再通过f的全过程中,都有相对应的点。 ==奇数尺寸的模板会更加直观,有一个明确的中心点。==
  • 相关和卷积

相关:按照上面理解的方式处理图像数组。

卷积:模板旋转180度后再以相同的方式处理图像数组。
- full和same

‘full’:填充图像,进行相关计算。
‘same’:产生一个大小与f相同的相关。这种计算同样用0填充,但是开始的位置位于f的原点与模板的中心的对准的位置。
- 实现线性空间滤波

g = imfilter(f, w, filtering_mode, boundary_options, size_option)

w为滤波模板,filtering_mode相关完成滤波为‘corr’,对卷积规定为‘conv’;boundary_options处理边界填充问题,边界大小有滤波器尺寸确定;size_option不是‘same’就是‘full’。

>> f = im2double(f);
>> subplot(231), imshow(f), title('f');
>> w = ones(31);
>> gd = imfilter(f, w);
>> subplot(232), imshow(gd, []), title('gd');
>> gr = imfilter(f, w, 'replicate');
>> subplot(233), imshow(gr, []), title('gr');
>> gs = imfilter(f, w, 'symmetric');
>> subplot(234), imshow(gs, []), title('gs');
>> gc = imfilter(f, w, 'circular');
>> subplot(235), imshow(gc, []), title('gc');
>> f8 = im2uint8(f);
>> g8r = imfilter(f, w, 'replicate');
>> subplot(236), imshow(g8r, []), title('g8r');

image

非线性滤波

线性滤波是基于计算乘积和,而非线性滤波则基于涉及滤波器包围的邻域内像素的非线性操作。
- 非线性滤波器处理函数

g = colifilt(f, [m n], ‘sliding’, fun)

‘sliding’表明处理过程中m x n区域在输入图像f中逐像素滑动,fun是函数句柄。

>> f = Fig0216;
>> subplot(121), imshow(f);
>> gmean = @(A)prod(A, 1) .^ 1/size(A, 1);
>> g = colfilt(f, [5 5], 'sliding', gmean);
>> subplot(122), inshow(g);

image

  • 边界填充

    fp = padarry(f, [r c], method, direction)


image

四.图像处理工具箱的标准空间滤波器

线性空间滤波
  • 线性空间滤波实现函数

    w = fspecial(‘type’, parameters)


‘type’定义滤波器的类型,parameters进一步规定滤波器。
image
  • 实现拉普拉斯滤波器
>> f = Fig0217;
>> w = [0 1 0; 1 -4 1; 0 1 0];
>> g1 = imfilter(f, w, 'replicate');
>> f2 = im2double(f);
>> g2 = imfilter(f2, w, 'replicate');
>> g = f2 - g2;
>> subplot(141), imshow(f)
>> subplot(142), imshow(g1, [ ])
>> subplot(143), imshow(g2, [ ])
>> subplot(144), imshow(g)

image

用原图减去拉普拉斯图像就是增强后的图像。

  • 手工指定滤波器及增强技术比较
>> f = Fig0217;
>> w4 = fspecial('laplacian', 0);
>> w8 = [1 1 1; 1 -8 1; 1 1 1];
>> f = im2double(f);
>> g4 = f - imfilter(f, w4, 'replicate');
>> g8 = f - imfilter(f, w8, 'replicate');
>> subplot(131), imshow(f);
>> subplot(132), imshow(g4);
>> subplot(133), imshow(g8);

image

图片清晰度逐渐增加,使用中心系数为-8的拉普拉斯滤波器为三张图片中最清晰的一个。

非线性空间滤波器

这些非线性空间滤波器的响应基于对图像邻域中所包含像素的排序,然后使排序结果确定的值替换邻域中的中心像素。

g = ordfilt2(f, order, domain)

使用order个元素去替代f中的每个元素,domain是一个由0和1组成的大小为m x n的矩阵。


  • 中值滤波器

g = ordfilt2(f, (m * n + 1) / 2, ones(m, n))
g = medfilt2(f, [m n], padopt)

[m n]定义一个大小为m x n的邻域,padopt指定三个可能的边界填充选项:‘zeros’(默认值),‘symmetric’指出f按照镜像反射方式对称地沿边界扩展,‘indexed’表示若f是double类则用1填充,否则用0填充。

>> f = Fig0219;
>> fn = imnoise(f, 'salt & pepper', 0.2);
>> subplot(141), imshow(f);
>> subplot(142), imshow(fn);
>> gm = medfilt2(fn);
>> subplot(143), imshow(gm);
>> gms = medfilt2(fn, 'symmetric');
>> subplot(144), imshow(gms);

image

2017-06-16 22:29:28 qq_36771850 阅读数 644
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

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

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

第二章 空间变换与空间滤波

函数 imadjust 和 stretchlim

  • imadjust用于对灰度级图像进行灰度变换。

    语法格式:g = imadjust(f,[low_in high_in],[low_out high_out],gamma)

    f = imread('pig.jpg');
    g1 = imadjust(f,[0,1],[1,0]);
    imshow(g1)
    g = imcomplement(f);
    imshow(g)
    g2 = imadjust(f,[0.5 0.75],[0 1]);
    figure,imshow(g2)
    figure,imshow(f)
    figure,imshow(g)
    figure,imshow(g2)
    g3 = imadjust(f,[],[],2);
    figure,imshow(g3)

    fg1
    g2g3
    以上分别为原图和变换后的图片
    图像的负片同样可以利用函数imcompment得到
    g = imcomplment(f);

    • stretchlim主要用于自适应找到一个分割阈值向量来改变一幅图像的对比度

    语法格式:low_high = stretchlim(f,tol);,其中tol是一个标量,默认值我为[0.01 0.99],饱和级别为2%。若选择tol = 0,则Low_High = [min(f(:)) max(f(:))]
    注:max(A)和max(A)将返回数组A的最大元素和最小元素。

    > Low_High = stretchlim(f)
    >
    >Low_High =
    >
    > 0.1765 0.1020 0.0863
    > 1.0000 0.9294 0.8667
    >
    > g = imadjust(f,stretchlim(f),[]);
    > figure,imshow(g)
    > g = imadjust(f,stretchlim(f),[1 0]);
    > figure,imshow(g)
    >

对数及对比度拉伸变换

表达式:g = c*log(1+f)

gs = im2uint8(mat2gray(g));
imshow(gs)

g = im2uint8(mat2gray(log(1+double(f))))
imshow(g)

使用对数变换可以使图像比较暗部分的细节显示出来,如下图。
这里写图片描述

指定任意灰度变换

实现灰度映射

函数:interp1,语法形式:g = interp1(z,T,f),其中f是输入图像,g是输出图像,T是一个列向量,z是长度与T相同的列向量,形成方式为z = linspace(0,1,numel(T))
注:linspace函数会生成一行向量。

用于灰度变换的一些实用函数

  • nargin : 检测输入到M函数的参数数目 n = nargin
  • nargout : 检测M函数的输出参数数目 n= nargout

    function [x0, y0] = myplot(x, y, npts, angle, subdiv)
    % MYPLOT  Plot a function.
    % MYPLOT(x, y, npts, angle, subdiv)
    %     The first two input arguments are
    %     required; the other three have default values.
    ...
    if nargin < 5, subdiv = 20; end
    if nargin < 4, angle = 10; end
    if nargin < 3, npts = 25; end
    ...
    if nargout == 0
       plot(x, y)
    else
       x0 = x;
      y0 = y;
    end
  • varargin : 对应nargin个数的单元数组

  • varargout : 对应nargout个数的单元数组

    function varargout=add(a,b,varargin)
    if nargin==2
    varargout{1}=a+b;
    elseif nargin==3
    varargout{1}=a+b;
    varargout{2}=a+b-varargin{1};
    end

函数intrans

实现:function g = intrans(f,method,varargin)
调用:g = intrans(f,’stretch’,mean2(tofloat(f)),0.9)
bones

函数gscale将图像标度在全尺度

实现:function g = gscale(f, varargin)
调用:g = gscale(f,method,low,high)

%GSCALE Scales the intensity of the input image.
%   G = GSCALE(F, 'full8') scales the intensities of F to the full
%   8-bit intensity range [0, 255].  This is the default if there is
%   only one input argument.
%
%   G = GSCALE(F, 'full16') scales the intensities of F to the full
%   16-bit intensity range [0, 65535].
%
%   G = GSCALE(F, 'minmax', LOW, HIGH) scales the intensities of F to
%   the range [LOW, HIGH]. These values must be provided, and they
%   must be in the range [0, 1], independently of the class of the
%   input. GSCALE performs any necessary scaling. If the input is of
%   class double, and its values are not in the range [0, 1], then
%   GSCALE scales it to this range before processing.
%
%   The class of the output is the same as the class of the input.

%   Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
%   Digital Image Processing Using MATLAB, Prentice-Hall, 2004
%   $Revision: 1.5 $  $Date: 2003/11/21 14:36:09 $

if length(varargin) == 0 % If only one argument it must be f.
   method = 'full8';
else
   method = varargin{1};
end

if strcmp(class(f), 'double') & (max(f(:)) > 1 | min(f(:)) < 0)
   f = mat2gray(f);
end

% Perform the specified scaling.
switch method
case 'full8'
   g = im2uint8(mat2gray(double(f)));
case 'full16'
   g = im2uint16(mat2gray(double(f)));
case 'minmax'
   low = varargin{2}; high = varargin{3};
   if low > 1 | low < 0 | high > 1 | high < 0
      error('Parameters low and high must be in the range [0, 1].')
   end
   if strcmp(class(f), 'double')
      low_in = min(f(:));
      high_in = max(f(:));
   elseif strcmp(class(f), 'uint8')
      low_in = double(min(f(:)))./255;
      high_in = double(max(f(:)))./255;
   elseif strcmp(class(f), 'uint16')
      low_in = double(min(f(:)))./65535;
      high_in = double(max(f(:)))./65535;   
   end
   % imadjust automatically matches the class of the input.
   g = imadjust(f, [low_in high_in], [low high]);  
otherwise
   error('Unknown method.')
end

直方图处理与函数绘图

生成并绘制直方图

一幅数字图像在[0 G]范围内总共有L个灰度级,其直方图定义为下列离散函数:
h(rk) = nk;
rk:k级灰度,相当于自变量,nk:rk这种灰度级对应的像素数。对于unit8 ,G对应255;对于unit16,G对应65535;对于浮点图像,G对应1.0
归一化直方图:p(rk) = h(rk)/n = nk/n,pk可以看做灰度级rk出现的概率
处理直方图函数:imhist(f,b) f 为输入图像,h 为其直方图,b是用来形成直方图的“容器”的数目(b )

直方图均衡

直方图是图像的最基本的统计特征,它反映的是图像灰度值的分布情况,其反映了图像的明暗分布规律,通过图像变换进行直方图调整,可以获得较好的视觉效果。直方图均衡化是一种点操作,它逐点改变输入图像的灰度值,尽量使各个灰度级别都具有相同的数量的像素点(即输出的直方图是平的),使直方图趋于平衡,这对于图像比较或分割是十分有用的。
归一化直方图:p = imhist(f,b) / numel(f)

f = imread('Fig3.15(a)1top.jpg');
g = histeq(f);
subplot(121),imshow(f);
subplot(122),imshow(g);
figure,subplot(121),imhist(f);
subplot(122),imhist(g);

图片
直方图均衡

直方图匹配

将图像直方图以标准图像的直方图为标准作变换,使两图像的直方图相同和近似,从而使两幅图像具有类似的色调和反差。在遥感图像处理中,直方图匹配应用于:①图像镶嵌中图像的灰度调节,通过直方图匹配使相邻两幅图像的色调和反差趋于相同。②多时相图像处理中以一个时相的图像为标准,调节另一幅图像的色调与反差,以便作进一步的运算。③以一幅增强后色调和反差比较满意的图像为标准,对另一幅图像作处理,期望得到类似的结果。
语法:g = histeq(f,hspec),f为输入图像,hspec为规定的直方图,g为输出图像。
直方图均衡与直方图匹配的区别:
生成具有指定直方图的图像的方法称为直方图匹配或直方图规定化。直方图均衡化是将原图像经变换生成一幅灰度级较为均衡化的图像。

空间滤波

线性空间滤波

线性空间滤波与非线性空间滤波
线性空间滤波为对领域像素的计算为线性运算时(如均值滤波、高斯滤波等),否则为非线性空间滤波(如中值滤波、最大最小滤波)
相关和卷积
将模板反转180度的相关就是卷积,相关和图像顺序有关,而卷积无关
相关函数
fspecial函数用于创建预先定义好的滤波器
imfilter函数实现线性空间滤波和特殊的非线性空间滤波
colfilt实现非线性空间滤波,使用前需用padarray来填充,nlfilter也可实现非线性空间滤波,但不常用
ordfilt2也可实现非线性空间滤波

【matlab函数描述】
功能:对任意类型数组或多维图像进行滤波。
用法:B = imfilter(A,H)
   B = imfilter(A,H,option1,option2,…)
   或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:
这里写图片描述
imfilter的应用

f(1:250,250:500) = 1;
f(250:500,1:250) = 1;
subplot(231),imshow(f),title('f');
w = ones(31);
subplot(232),gd = imfilter(f,w);imshow(gd,[]),title('gd');
subplot(233),gr = imfilter(f,w,'replicate');imshow(gr,[]),title('gr');
subplot(234),gs = imfilter(f,w,'symmetric');imshow(gs,[]),title('gs');
subplot(235),gc = imfilter(f,w,'circular');imshow(gc,[]),title('gc');
subplot(236),g8r = imfilter(im2uint8(f),w,'replicate');imshow(g8r,[]),title('g8r');

这里写图片描述

非线性空间滤波

matlab工具箱提供了两个执行常规非线性滤波的函数:nlfilter和colfilt。nlfilter直接执行二维操作,而函数colfilt则以列的形式组织数据,虽然colfilt比nlfilter要占用更多的内存,但执行速度要比nlfilter快许多,因此实际使用中如果注重速度,肯定都是选择的colfilt。
colfilt的原型如下:g=colfilt (f, [m n], ‘sliding’, @fun, parameters).
f:要进行滤波的原图像
[m,n]:掩膜(邻域)的尺寸,一般为奇数*奇数
sliding:块模式,sliding说明逐个像素的滑动mxn区域
@fun:真是实现滤波的函数,它是一个函数指针,我们定义一个函数对mxn区域的像素进行处理,而>这个函数会被colfilt自动调用。
parameters:我们定义的函数要传入的其他参数。

在使用colfilt时,滤波前必须显示的填充输入图像。为此,实验二维函数padarray,
fp = padarray(f,[r c],method,direction)
f = [1 2;3 4];

fp = padarray(f,[4 5],’replicate’,’post’)

fp =

 1     2     2     2     2     2     2
 3     4     4     4     4     4     4
 3     4     4     4     4     4     4
 3     4     4     4     4     4     4
 3     4     4     4     4     4     4
 3     4     4     4     4     4     4

使用函数colfilt

f = imread('Fig3.20(a).jpg');
   subplot(121),imshow(f)
   g = uint8(colfilt(f,[5 5],'sliding',@mean));
   subplot(122), imshow(g)

这里写图片描述

图像处理工具箱的标准空间滤波器

线性空间滤波器

工具箱支持许多预定义的二维线性空间滤波器可通过函数fspecial生成的一个滤波模板w,语法为:
w = fspecial(‘type’,parameters)
其中‘type’指定滤波器的类型,parameters进一步定义规定的滤波器。

G=fspecial('gaussian',5)%参数为5,表示产生5*5的gaussian矩阵,如果没有,默认为3*3的矩阵。
G =
    0.0000    0.0000    0.0002    0.0000    0.0000
    0.0000    0.0113    0.0837    0.0113    0.0000
    0.0002    0.0837    0.6187    0.0837    0.0002
    0.0000    0.0113    0.0837    0.0113    0.0000
    0.0000    0.0000    0.0002    0.0000    0.0000
G=fspecial('gaussian',5,1.5)%1.5为滤波器的标准差。
G =
    0.0144    0.0281    0.0351    0.0281    0.0144
    0.0281    0.0547    0.0683    0.0547    0.0281
    0.0351    0.0683    0.0853    0.0683    0.0351
    0.0281    0.0547    0.0683    0.0547    0.0281
    0.0144    0.0281    0.0351    0.0281    0.0144

G=fspecial('average')%默认为3*3的矩阵。均值滤波
G =
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111
> G=fspecial('average',5)%会产生5*5的矩阵。
手工指定滤波器及增强技术的比较
f = imread('Fig3.40(a).jpg');
w4 = fspecial('laplacian',0);
w8 = [1 1 1;1 -8 1;1 1 1];
f = tofloat(f);
g4 = f - imfilter(f,w4,'replicate');
g8 = f - imfilter(f,w8,'replicate');
subplot(131),imshow(f),title(f);
subplot(132),imshow(g4),title(g4);
subplot(133),imshow(g8),title(g8);

月球

非线性空间滤波

函数ordfilt2的语法:g = ordfilt2(f,order,domain)

 f=[1 2 3 ;4 5 6;7 8 9];
g=ordfilt2(f,median(1:9),ones(3,3))
g =
     0     2     0
     2     5     3
     0     5     0
g=ordfilt2(f,1,ones(3,3))
g =
     0     0     0
     0     1     0
     0     0     0
g=ordfilt2(f,9,ones(3,3))
g =
     5     6     6
     8     9     9
     8     9     9
利用函数medfilt2进行中指滤波
fn = imnoise(f,'salt & pepper',0.2);
gm = medfilt2(fn);
gms = medfilt2(fn,'symmetric');

这里写图片描述

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