2015-05-13 11:44:59 buaalei 阅读数 7121
  • PHP7 GD库实战教程

    King老师精心打造的PHP7GD库实战课程,由浅入深的讲解了PHP中操作图像的核心函数库GD库的使用,讲解了常见API,并通过实战案例进行实战演练,让我们一起开启GD库实战教程之旅吧~ 山哥出品,必属精品!

    16071 人正在学习 去看看 何山

利用X方向与Y方向分别实现一阶微分,求取振幅,实现图像梯度效果,微分算子Prewitt与Sobel。

其中Sobel的表示:

 

梯度幅值:

在X, Y两个方向算子分别为:


Prewitt在X, Y方向上梯度算子分别为:

opencv Sobel算子函数:

void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0,int borderType=BORDER_DEFAULT )
参数
src – 输入图像。
dst – 输出图像,与输入图像同样大小,拥有同样个数的通道。
ddepth –
输出图片深度;下面是输入图像支持深度和输出图像支持深度的关系:
src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F, ddepth = -1/CV_64F
当 ddepth为-1时, 输出图像将和输入图像有相同的深度。输入8位图像则会截取顶端的导数。
xorder – x方向导数运算参数。
yorder – y方向导数运算参数。
ksize – Sobel内核的大小,可以是:1,3,5,7。
scale – 可选的缩放导数的比例常数。
delta – 可选的增量常数被叠加到导数中。
borderType – 用于判断图像边界的模式。

//在x方向求图像近似导数

Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
//在y方向求图像近似导数
Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );

如果我们打印上面两个输出矩阵,可以看到grad_x和grad_y中的元素有正有负。

当然,正方向递增就是正的,正方向递减则是负值,我们可以用来判断梯度方向。


convertScaleAbs函数
线性变换转换输入数组元素成8位无符号整型。
void convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
参数
src – 输入数组。
dst – 输出数组。
alpha – 可选缩放比例常数。
beta – 可选叠加到结果的常数。
对于每个输入数组的元素函数convertScaleAbs 进行三次操作依次是:缩放,得到一个绝对值,转换成无符号8位类型。
对于多通道矩阵,该函数对各通道独立处理。如果输出不是8位,将调用Mat::convertTo 方法并计算结果的绝对值。


addWeighted函数
计算两个矩阵的加权和。
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, intdtype=-1)
参数
src1 – 第一个输入数组。
alpha – 第一个数组的加权系数。
src2 – 第二个输入数组,必须和第一个数组拥有相同的大小和通道。
beta – 第二个数组的加权系数。
dst – 输出数组,和第一个数组拥有相同的大小和通道。
gamma – 对所有和的叠加的常量。
dtype – 输出数组中的可选的深度,当两个数组具有相同的深度,此系数可设为-1,意义等同于选择与第一个数组相同的深度。
在多通道情况下,每个通道是独立处理的,该函数可以被替换成一个函数表达式:
dst = src1*alpha + src2*beta + gamma;


使用方法:

  /////////////////////////// Sobe l////////////////////////////////////
  /// Generate grad_x and grad_y
  Mat grad_x, grad_y;
  Mat abs_grad_x, abs_grad_y;
  /// Gradient X
  //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
  //Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator.
  Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );   
  convertScaleAbs( grad_x, abs_grad_x );
  /// Gradient Y  
  //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
  Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );   
  convertScaleAbs( grad_y, abs_grad_y );
  /// Total Gradient (approximate)
  addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );


2018-06-23 09:08:02 Alphabetic 阅读数 3362
  • PHP7 GD库实战教程

    King老师精心打造的PHP7GD库实战课程,由浅入深的讲解了PHP中操作图像的核心函数库GD库的使用,讲解了常见API,并通过实战案例进行实战演练,让我们一起开启GD库实战教程之旅吧~ 山哥出品,必属精品!

    16071 人正在学习 去看看 何山

图像在计算机中以数字图像的形式存储,即以数值矩阵的形式存在,形成了离散的数值信号,在此基础上,对于图像处理中的数值的多样性计算分析也影响着初步图像分析。

图像梯度的定义:

图像函数f(x,y)在点(x,y)的梯度是一个具有大小和方向的矢量,设为Gx 和 Gy 分别表示x方向和y方向的梯度,这个梯度的矢量可以表示为:

                                                            

图像梯度:G(x,y)=dx i +dy j;

dx(i,j)=Img(i+1,j)-Img(i,j);

dy(i,j)=Img(i,j+1)-I(i,j);


Img(i,j)是图像数值矩阵的像素值,(i,j)为像素相应坐标。

Gradient(Img)函数求的是数值上的梯度,假设Img为图片数值矩阵.


Matlab中计算方法:

 [Rx,Ry]=gradient(Img);

(1)水平方向梯度Rx,Rx的第一列元素为原矩阵第二列与第一列元素之差,Rx的第二列元素为原矩阵第三列与第一列元素之差除以2,以此类推:Fx(i,j)=(F(i,j+1)-F(i,j-1))/2。最后一列则为最后两列之差。

(2)垂直方向梯度Ry,同理,可以得到Fy。


2019-07-23 15:49:18 space_walk 阅读数 95
  • PHP7 GD库实战教程

    King老师精心打造的PHP7GD库实战课程,由浅入深的讲解了PHP中操作图像的核心函数库GD库的使用,讲解了常见API,并通过实战案例进行实战演练,让我们一起开启GD库实战教程之旅吧~ 山哥出品,必属精品!

    16071 人正在学习 去看看 何山

只提供代码,不提供思路,思路看课本。
主函数:

% 读入图像
img_1 = imread('Fig0342(a)(contact_lens_original).tif');
% Sobel模板
model_1 = [-1, -2, -1; 0, 0, 0; 1, 2, 1];
model_2 = [-1, 0, 1; -2, 0, 2; -1, 0, 1];

% 调用函数处理
img_2 = m_15_Gradient_Enhancement_process(img_1, model_1, model_2);

% 显示结果
subplot(121), imshow(img_1);
subplot(122), imshow(img_2);

m_15_Gradient_Enhancement_process.m 代码如下:

function img_2 = m_15_Gradient_Enhancement_process(img_1, model_1, model_2)

% 信息获取
[r, c] = size(img_1);
[~, m] = size(model_1);
% 获得填充边后的图像
img_1s = m_10_Smooth_create_img(img_1, r, c, m - 1);
% 创建新图像
img_2 = zeros(r, c);

for x = 1 : r
    for y = 1 : c
        % 求 g_x 和 g_y
        sum_1 = 0;
        sum_2 = 0;
        for i = 1 : m
            for j = 1 : m
                sum_1 = sum_1 + model_1(i, j) * img_1s(x + i - 1, y + j - 1);
                sum_2 = sum_2 + model_2(i, j) * img_1s(x + i - 1, y + j - 1);
            end
            % 绝对值之和
            img_2(x, y) = abs(sum_1) + abs(sum_2);
        end
    end
end

% 处理图像
img_2 = im2uint8(mat2gray(img_2));
end

实验结果如下:
实验结果

2019-07-18 18:11:59 SuzukiT 阅读数 96
  • PHP7 GD库实战教程

    King老师精心打造的PHP7GD库实战课程,由浅入深的讲解了PHP中操作图像的核心函数库GD库的使用,讲解了常见API,并通过实战案例进行实战演练,让我们一起开启GD库实战教程之旅吧~ 山哥出品,必属精品!

    16071 人正在学习 去看看 何山

假期呆实验室,老师给的一些小任务,拿来作为第一篇博客练手

图像梯度的概念:
详情请看:图像梯度的基本原理

重点在于:图像的梯度和函数的梯度概念差不多,图像可以看做是离散的函数,每个离散点即为像素。根据梯度的微分表达式可得,图像的梯度可以相当于2个相邻像素之间的差值。相邻两个像素的像素值相差越大,梯度越大。可以用做提取边缘信息。

思路:读取图片后,转化为灰度图,再转化为double类型。根据图像梯度的概念,分别算x和y反向上的梯度,然后相加,作为这一像素的像素值。然后将梯度图(提取的边缘信息图)与原图像相加,得到合成图,相当于给原图像增强了边缘。

为什么要转化为double类型?
因为imread()读入的图像是uint8类型,将原图像的灰度值转换成double的作用主要是考虑计算过程中的精度的问题,double 的数据是有小数点的,而uint8是0-255的整数,如果直接用uint8计算,会在计算过程中产生舍入误差,这种误差在图像的数据中是比较大的误差。显示的时候是因为我们的显示系统采用的颜色模式大多为RGB模式,其每一种颜色分量的取值只能在0-255,所以显示时要用uint8数据。

为什么要把图像转为灰度图进行处理?
我们识别物体,最关键的因素是梯度(现在很多的特征提取,SIFT,HOG等等本质都是梯度的统计信息),梯度意味着边缘,这是最本质的部分,而计算梯度,自然就用到灰度图像了。颜色本身,非常容易受到光照等因素的影响,同类的物体颜色有很多变化。所以颜色本身难以提供关键信息。

以上转自小波变换图像融合-1-代码分析


%任务2.3
%图像处理场景:图像边缘增强
clear;
clc;

%%
I = imread('F:\学习\实验室\Matlab 图像处理练习\IMG_1106.jpg');
I = rgb2gray(I);
I = im2double(I);
figure('Numbertitle','off','name','原图像');
imshow(I);

%梯度图
gradient = zeros(3024,4032);
for i = 1:3023
    for j = 1:4031
        gx = abs(I(i+1,j) - I(i,j) );
        gy = abs(I(i,j+1) - I(i,j) );
        grad = gx + gy;
        gradient(i,j) = grad;
    end
end
figure('Numbertitle','off','name','gradient');
imshow(gradient);

%合成
compose = I + gradient;
compose = im2uint8(compose);
figure('Numbertitle','off','name','合成');
imshow(compose);
2018-11-26 20:14:41 FPGATOM 阅读数 277
  • PHP7 GD库实战教程

    King老师精心打造的PHP7GD库实战课程,由浅入深的讲解了PHP中操作图像的核心函数库GD库的使用,讲解了常见API,并通过实战案例进行实战演练,让我们一起开启GD库实战教程之旅吧~ 山哥出品,必属精品!

    16071 人正在学习 去看看 何山

0、图像梯度

梯度的方向是函数变化最快的方向, 当图像中存在边缘时,一定有较大的梯度值。相反,当图像中有比较平滑的部分时,灰度值变化较小,相应的梯度也较小。 图像处理中把梯度的模简称为梯度。 通常我们用小区域模板进行卷积来计算梯度,常用的梯度算子有Sobel算子,Robinson算子,Laplace算子等。

1、离散图像的梯度

图像是一个离散空间,无法真正的求导,只有通过多项式拟合图像中某一点的导数,然后将该点处的x,y方向的导数视为该点的梯度。
梯度计算公式:

grad(x,y) = dx*i + dy*j
dx(i,j) = I(i+1,j)  - I(i,j)  //X方向偏导,该行与上一行的差值
dy(i,j) = I(i,j+1) - I(i,j)  //Y方向偏导,该列与上一列的差值

图像的一阶导数通常会产生较粗的边缘
代码实现:

//////////////////////////////////////////////////////////////////////////
/// \brief  图像梯度求解原型
/// \remark 
/// \param[in]  src    源灰度图
/// \param[in]  width  源灰度图宽
/// \param[in]  height  源灰度图高
/// \param[in/out]  grad_x   x方向梯度
/// \param[in/out]  grad_y   y方向梯度
/// \return     void
//////////////////////////////////////////////////////////////////////////
void Calcul_Gradian(const unsigned char*  src, int width, int height, char *  grad_x, char* grad_y)
{
   int rows = 0, cols = 0;

   for (rows = 0; rows < height - 1; rows++)
   {
       int idx = rows * width;

       for (cols = 0; cols < width - 1; cols++)
       {
           grad_x[idx + cols] = src[idx + cols + 1] - src[idx + cols];
           grad_y[idx + cols] = src[idx + cols + width] - src[idx + cols];
       }
   }
}

2、输出

Y方向–水平边缘明显,垂直边缘不明显(窗户那边明显看得出)
在这里插入图片描述

X方向–垂直边缘明显,水平边缘不明显(窗户那边明显看得出)
在这里插入图片描述

3、参考

https://blog.csdn.net/image_seg/article/details/78790968
https://blog.csdn.net/xieyan0811/article/details/70882266
https://blog.csdn.net/Touch_Dream/article/details/62447801

图像的梯度和幅值

阅读数 9500

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