2014-09-27 17:29:11 u011368821 阅读数 3338
• ###### OpenCV3.2 Java图像处理视频学习教程

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

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

# Image edge detection

今天听到师姐做报告，接触到了“各种算子” 感觉很有意思~ 图像的线性处理以及边缘检测.

下面是一个普通图片，我们可以观察到在图片中有飞机和汽车，在数字图像处理中，边缘特征的提取(说白了就是把图像中物体边缘的坐标点标记出来，没别的)

wait wait... 这是连续领域的啊！数字图像信息以离散的数字储存，肿么办？差分！

point(x,y) - point(x+1,y+1) 这样做差分结果是不是接近于0 ? (废话，肯定嘛 \-0-/ )

operator = [z1 z2  z3;

z4  z5  z6;

z7  z8  z9];

i4 i5 i6;

i7 i8 i9];

Filted_img  = [ f1 f2 f3;

f4 f5 f6;

f7 f8 f9];

f5 = z1*i1 + z2*i2 + z3*i3 + z4*i4 + z5*i5 + z6*i6 + z7*i7 + z8*i8 +z9*i9;

0 0 0

0 1 0

0 0 0

0 0 0

0 1 0

0 0 -1

0 0 0

0 1 0

0 0 -1

-1  0 1

-2  0 2

-1  0 1

1  2  1

0  0  0

-1 -2 -1

Octave (matlab )实现代码：

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% code writer 	:	EOF
% code date	    :	2014.09.27
% code file	    :	img_filter_sobel.m
% e-mail	      :	jasonleaster@gmail.com
%
%	If there is something wrong with my code, please
% touch me by e-mail. Thank you :)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clear all
clc

float_Orignal_img = double(Original_img);

F64_WHITE = 255.0;
F64_BLACK = 0.000;

THRESHOLD = 40;

sobel_operator_X = [-1, 0, 1;-2,0,2;-1, 0, 1];
sobel_operator_Y = [1 , 2, 1; 0,0,0;-1,-2,-1];

Original_img_row 	= size(Original_img,1);
Original_img_col 	= size(Original_img,2);
Original_img_channel 	= size(Original_img,3);

sobel_operator_X_row = size(sobel_operator_X,1);
sobel_operator_X_col = size(sobel_operator_X,2);

sobel_operator_Y_row = size(sobel_operator_Y,1);
sobel_operator_Y_col = size(sobel_operator_Y,2);

dark_channel = zeros(Original_img_row,Original_img_col);
Filted_img   = zeros(Original_img_row,Original_img_col);

for row = 1:Original_img_row

for col = 1:Original_img_col

min_piexl = F64_WHITE;
for channel = 1: Original_img_channel

if(min_piexl > Original_img(row,col,channel))

min_piexl = Original_img(row,col,channel);
end
end

dark_channel(row,col) = min_piexl;
end
end

for row = 1:Original_img_row

for col = 1:Original_img_col

conv_sum_X = 0;
for square_row = (row - floor(sobel_operator_X_row/2)) : (row + floor(sobel_operator_X_row/2))
for square_col = (col - floor(sobel_operator_X_col/2)) : (col + floor(sobel_operator_X_col/2))

if square_row <= Original_img_row && square_col <= Original_img_col && ...
square_row > 0                 && square_col > 0
conv_sum_X = conv_sum_X + ...
dark_channel(square_row,square_col)...
*sobel_operator_X(square_row - (row - floor(sobel_operator_X_row/2)) + 1,square_col - (col - floor(sobel_operator_X_col/2)) + 1);

end
end
end

conv_sum_Y = 0;
for square_row = (row - floor(sobel_operator_Y_row/2)) : (row + floor(sobel_operator_Y_row/2))
for square_col = (col - floor(sobel_operator_Y_col/2)) : (col + floor(sobel_operator_Y_col/2))

if square_row <= Original_img_row && square_col <= Original_img_col && ...
square_row > 0                 && square_col > 0

conv_sum_Y = conv_sum_Y + ...
dark_channel(square_row,square_col)...
*sobel_operator_Y(square_row - (row - floor(sobel_operator_X_row/2)) + 1,square_col - (col - floor(sobel_operator_X_col/2)) + 1);

end
end
end

Filted_img(row,col) = sqrt(conv_sum_X*conv_sum_X +conv_sum_Y*conv_sum_Y);

end
end

figure(1);
subplot(1,2,1);
imshow(Original_img);
title('Original Image')
subplot(1,2,2);
imshow(uint8(Filted_img));
title('Filted Image');


scharr 算子

-3   0 3

-10 0 10

-3   0  3

3 10 3

0  0  0

-3 -10 -3

2017-04-01 14:15:26 PaTricKHzp 阅读数 1173
• ###### OpenCV3.2 Java图像处理视频学习教程

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

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

SURF将DoH中的高斯二阶微分模板进行了近似简化，使得模板对图像的滤波只需要进行几个简单的加减法运算，并且，这种预算与滤波模板的尺寸无关，从而极大地提高了尺度不变特征的检测速度。

2018-10-03 15:46:39 u013921430 阅读数 4194
• ###### OpenCV3.2 Java图像处理视频学习教程

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

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

## 灰度图边缘检测

在学习图像处理时，首先接触到的就是灰度图像的边缘检测，这是图像处理最基础的也是最重要的一环，熟悉图像边缘检测有助于我们学习其他的数字图像处理方法。由于图像的边缘区域会存在明显的像素值阶跃，因此边缘检测主要是通过获得图像灰度梯度，进而通过梯度大小和变化来判断图像边缘的。

因此，我们可以通过一阶差分；
$\Delta f_{x}(x,y)=f(x+1,y)-f(x,y)\\ \Delta f_{y}(x,y)=f(x,y+1)-f(x,y)$
或者二阶差分对边缘区域进行判断；
$\Delta f_{xx}(x,y)=f(x+1,y)+f(x-1,y)-2f(x,y)\\ \Delta f_{yy}(x,y)=f(x,y+1)+f(x,y-1)-2f(x,y)$
其中一阶差分可以判断边缘是否存在，二阶差分还可以根据正负号判断像素点在图像边缘亮的一侧还是暗的一侧。
其他的边缘检测方法还包括一些梯度算子，例如Prewitt算子、Sobel算子，Canny算子，LOG边缘检测算子等，在此不做说明。

## 彩色图边缘检测

RGB 图像使用三个通道存储像素信息，我们可以将这三个通道的信息看作是一个矢量，而矢量是不存在梯度的概念的，我们无法直接将上诉方法或算子直接用于RGB 图像，而且RGB图像单个通道的梯度信息又无法反映整体的梯度信息。
在《数字图像处理》（冈萨雷斯）中提到了一种针对彩色图像的边缘检测方法，这种方法由 Di Zenzo 等人在1986年提出，下面就一起看看这种方法如何得出。

### Di Zenzo’s gradient operator

在图像多通道图像$f(x,y)$ 中的某一点$P(x,y)$ 处，假设其梯度方向为$\theta$
$\Delta f=\left \| f(x+\varepsilon cos\theta,y+\varepsilon sin\theta) -f(x,y)\right \|$
为了便于计算，将计算绝对值换为计算平方，令
$\Delta f^{2}=\left \| f(x+\varepsilon cos\theta,y+\varepsilon sin\theta) -f(x,y)\right \|^{2}$
对$f(x+\varepsilon cos\theta,y+\varepsilon sin\theta)$进行二元泰勒展开；
\begin{aligned} f(x+\varepsilon cos\theta,y+\varepsilon sin\theta)&=f(x,y)+\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}(x,y)}{\partial x} +\varepsilon sin\theta\cdot\frac{\partial f_{i}(x,y)}{\partial y} )+o^{n}\\ &\approx f(x,y)+\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}(x,y)}{\partial x} +\varepsilon\cdot sin\theta\cdot\frac{\partial f_{i}(x,y)}{\partial y} ) \end{aligned}
其中$m$表示图像通道数目，为了方便表述使用$\frac{\partial f_{i}}{\partial x}$代替$\frac{\partial f_{i}(x,y)}{\partial x}$，而在求导时各个通道之间是相互独立的，则有；
$\Delta f^{2}\approx\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}}{\partial x} +\varepsilon sin\theta\cdot\frac{\partial f_{i}}{\partial y} )^{2}$
重新定义一个函数$G(\theta)$，令
\begin{aligned} G(\theta)&=\sum_{i=1}^{m}(\varepsilon cos\theta\cdot\frac{\partial f_{i}}{\partial x} +\varepsilon sin\theta\cdot\frac{\partial f_{i}}{\partial y} )^{2}\\ &=\varepsilon ^{2}(cos\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial x}\right \|^{2}+sin\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial y}\right \|^{2}+2sin\theta cos\theta \sum_{i=1}^{m}\frac{\partial f_{i}}{\partial x}\frac{\partial f_{i}}{\partial y}) \end{aligned}
进一步舍去式子中的$\varepsilon$ 项，令
$G(\theta)=cos\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial x}\right \|^{2}+sin\theta^{2}\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial y}\right \|^{2}+2sin\theta cos\theta \sum_{i=1}^{m}\frac{\partial f_{i}}{\partial x}\frac{\partial f_{i}}{\partial y}$
为了进一步方便表述；令
$E=\sum_{i=1}^{m}\left \| \frac{\partial f_{i}}{\partial x} \right \|^{2}; F=\sum_{i=1}^{m}\left \|\frac{\partial f_{i}}{\partial y}\right \|^{2}; H=\sum_{i=1}^{m}\frac{\partial f_{i}}{\partial x}\frac{\partial f_{i}}{\partial y}$
$G(\theta)=cos\theta^{2}E+sin\theta^{2}F+2sin\theta cos\theta H$
现在$\theta$成为了式子中唯一的变量，再回到边缘的定义上，边缘的方向是图像像素梯度最大的方向。也就是说梯度的方向$\theta_{max}$ 会使$G(\theta)$ 取最大值，则；
$\theta_{max}=\underset{argmax}{G(\theta )}$
对$G(\theta)$ 进行求导；
$G(\theta )^{'}=-Esin2\theta +F sin2\theta+2 H cos2\theta$
令$G(\theta )^{'}=0$，得；
$tan ~2\theta_{max} =\frac{2H}{E-F}\\ \theta_{max}=\frac{1}{2}arctan(\frac{2H}{E-F}+k\pi)$
很明显$G(\theta )$ 是一个以$\pi$ 为周期的周期函数，如果只考虑区间$\left [ 0 ,\pi\right )$，且$\theta_{max}$ 落到该区间内，则会有另一个让$G(\theta )$取极值的解也落在该区域内，这个值是$\theta_{max}+ \frac{\pi}{2}$或者$\theta_{max}-\frac{\pi}{2}$。但是不论如何这两个解有一个让$G(\theta )$取极大值，另一个让其取极小值，两个角度相差 90°。

说到这里大家应该都明白了，两个角度对应的方向是相互垂直的，一个是垂直于边缘的方向，也就是边缘的法向，此时梯度取最大值。另一个是平行于边缘的方向，是边缘的切向，此时梯度取极小值。

### RGB图像的边缘检测

在RGB图像中，$m=3$，再令；
$\overset{\rightarrow }{u}=\frac{\partial R}{\partial x}\overset{\rightarrow }{r}+\frac{\partial G}{\partial x}\overset{\rightarrow }{g}+\frac{\partial B}{\partial x}\overset{\rightarrow }{b}$
$\overset{\rightarrow }{v}=\frac{\partial R}{\partial y}\overset{\rightarrow }{r}+\frac{\partial G}{\partial y}\overset{\rightarrow }{g}+\frac{\partial B}{\partial y}\overset{\rightarrow }{b}$
其中$\overset{\rightarrow }{r}$$\overset{\rightarrow }{g}$$\overset{\rightarrow }{b}$分别代表不同颜色分量的单位向量，则
$g_{xx}=E=\overset{\rightarrow }{u}^{\tiny{T}}\overset{\rightarrow }{u}=\left \| \frac{\partial R}{\partial x} \right \|^{2}+\left \| \frac{\partial G}{\partial x} \right \|^{2}+\left \| \frac{\partial B}{\partial x} \right \|^{2}$
$g_{yy}=F=\overset{\rightarrow }{v}^{\tiny{T}}\overset{\rightarrow }{v}=\left \| \frac{\partial R}{\partial y} \right \|^{2}+\left \| \frac{\partial G}{\partial y} \right \|^{2}+\left \| \frac{\partial B}{\partial y} \right \|^{2}$
$g_{xy}=H=\overset{\rightarrow }{u}^{\tiny{T}}\overset{\rightarrow }{v}=\frac{\partial R}{\partial x}\frac{\partial R}{\partial y}+\frac{\partial G}{\partial x}\frac{\partial G}{\partial y}+\frac{\partial B}{\partial x}\frac{\partial B}{\partial y}$
在利用Di Zenzo 提出的方法求得$\theta_{max}$ 后，将以上符号带入到$G(\theta)$，可以计算出像素点梯度大小为
$G(\theta)=\left \{ \frac{1}{2}\left [ (g_{xx}+g_{yy}) +(g_{xx}-g_{yy})cos~2\theta_{max} +2g_{xy}sin~2\theta_{max} \right ]\right \}^{\frac{1}{2}}$
进而可以根据梯度大小进行边缘检测。

## 参考资料

1. S. Di Zenzo, A note on the gradient of a multi-image, Computer Vision, Graphics, and Image Processing 33 (1) (1986) 116–125.
2. 《数字图像处理》 (冈萨雷斯)

2018-12-22 09:26:43 lw18781108072 阅读数 649
• ###### OpenCV3.2 Java图像处理视频学习教程

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

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

## 1.边缘检测原理

1. 边缘检测算子的总结

### 1.Sobel算子

Sobel算子包含2个模板，之与图像作平面卷积，即可分别得出横向及纵向的亮度差分近似值。实际使用中，常用如下两个模板来检测图像边缘。

G=

G代表梯度，Gx为横向模板和领域的卷积，Gy为纵向模板和领域卷积。

1. Roberts算子

GX为横向模板和领域的卷积，Gy为纵向模板和领域卷积。

1. 拉普拉斯高斯算子（LOG）

LOG算子：是高斯和拉普拉斯的双结合，即集平滑和边沿于一身的算子模型！注意这个模型跟前面的一个滤波器很相似，就是各向异性滤波器！只不过是各向异性滤波器是高斯一阶导函数，而LOG可以看做是二阶导函数！这两个模型来源最初都是因为求导导致模板对噪声干扰敏感性比较强！

1. 处理的效果展示

2011-11-30 15:22:49 honesty2008 阅读数 3092
• ###### OpenCV3.2 Java图像处理视频学习教程

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

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

①找到亮度的一阶导数在幅度上比指定的阈值大的地方
②找到亮度的二阶导数有零交叉的地方。

本实验完成方法很多，可以通过以下途径解决：①直接用edge函数
②用imfilter 模拟③直接进行模拟 。值得注意的是由于Roberts掩膜是2*2的,

% 代码一 直接通过edge函数检测
clear;clc;figure;
subplot(2,2,1);imshow(I);title('orignal');
I1=edge(I,'sobel');
subplot(2,2,2);imshow(I1);title('sobel');
I2=edge(I,'prewitt');
subplot(2,2,3);imshow(I2);title('prewitt');
I3=edge(I,'roberts');
subplot(2,2,4);imshow(I3);title('roberts');
% 代码二 直接模拟
clear;clc;figure;
subplot(2,2,1);imshow(I);title('orignal');
s1=[-1 -2 -1; 0 0 0; 1 2 1];
s2=[-1 0 1; -2 0 2; -1 0 1 ];
p1=[-1 -1 -1; 0 0 0 ;1 1 1];
p2=[-1 0 1;-1 0 1; -1 0 1 ];
r1=[-1 0 ;0 1];r2=[0 -1; 1 0];
[r,c]=size(I);I=double(I);
for u=1:r-2
for v=1:c-2
gx=sum(sum(I(u:u+2,v:v+2).*s1));
gy=sum(sum(I(u:u+2,v:v+2).*s2));
Is(u,v)=sqrt(gx*gx+gy*gy);
gx=sum(sum(I(u:u+2,v:v+2).*p1));
gy=sum(sum(I(u:u+2,v:v+2).*p2));
Ip(u,v)=sqrt(gx*gx+gy*gy);
gx=sum(sum(I(u+1:u+2,v+1:v+2).*r1));
gy=sum(sum(I(u+1:u+2,v+1:v+2).*r2));
Ir(u,v)=sqrt(gx*gx+gy*gy);
end
end

Is1=Is;Ip1=Ip;Ir1=Ir;
scale=0.4;
Is2=Is1>max(max(Is1))*scale;
Ip2=Ip1>max(max(Ip1))*scale;
Ir2=Ir1>max(max(Ir1))*scale;
subplot(2,2,2);imshow(Is2,[]);title('sobel');
subplot(2,2,3);imshow(Ip2,[]);title('prewitt');
subplot(2,2,4);imshow(Ir2,[]);title('roberts');