2019-09-29 20:22:04 weixin_44225182 阅读数 557

图像锐化(原理篇)

       图像锐化处理的目的是为了使图像的边缘、轮廓线以及图像的细节变得清晰,经过平滑的图像变得模糊的根本原因是因为图像受到了平均或积分运算,因此可以对其进行逆运算(如微分运算,其实这里用的是差分)就可以使图像变得清晰。
       图像中边缘的定义是什么?在图像处理中认为,灰度值变化剧烈的地方就是边缘。变化剧烈程度,数学上就是函数的一阶导数。假设下面第一张图是图像的灰度函数,可以看出,中间变化较快的地方应该是图像的边缘。第二张图是图一的一阶导数,由数学知识可知,一阶导数的极值就是那个变化最快的点–边缘。第三张图是图一的二阶导数,二阶导数为0时,可以看出是图像的边缘处。所以,对于确定图像的边缘,我们只需要找到一阶导数为极值点或者二阶导数为0的位置就行(二阶导数为0不一定为边缘点 比如一副颜色相同的图像 其一阶导数 二阶导数都是0 没有边缘)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
       那为什么用差分来寻找边缘呢对于连续的函数来说,一阶导数就是直接求导,二阶同理。但是,图像本质是一个二维矩阵,离散型的。是无法求导的。这时候,就需要用到差分这个概念了。实在理解不到的话,可以认为:连续型函数是求导(求微分),离散型函数则是求差分。

一阶导数、二阶导数差分的证明
在这里插入图片描述
图像上差分的求法
在这里插入图片描述
常用一阶微分算子证明
在这里插入图片描述
二阶算子证明
在这里插入图片描述

更多

获取更多资料、代码,微信公众号:海轰Pro
回复 海轰 即可

2019-12-12 22:40:32 weixin_44225182 阅读数 214

一、实验名称

图像锐化

二、实验目的

1.熟悉MATLAB软件的使用。
2.掌握图像锐化的原理及数学运算。
3.于MATLAB环境下编程实现对图片锐化。

三、实验内容

    利用图像基于单方向梯度算子,Robert算子,Sobel算 子,Pritt算 子, Laplacian算子,多方向模板,LoG算子编写matlab增强程序;最后,显示边缘图像和锐化增强图像,并对这些仿真结果所呈现的边缘提取和增强效果进行对比分析。

四、实验仪器与设备

Win10 64位电脑
MATLAB2017a

五、实验原理

    1.Sobel算子是像素图像边缘检测中最重要的算子之一。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。
    2.Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内 产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。
    3.Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。
    4. Laplacian算子是n维欧几里得空间中的一个二阶微分算子,定义为梯度grad()的散度div()。因此如果f是二阶 可微的实函数,则f的laplacian算子定义为:
        (1) f的拉普拉斯算子也是笛卡尔坐标系xi中的所有非混合二阶偏导数求和:
        (2) 作为一个二阶 微分算子,拉普拉斯算子把C函数映射到C函数,对于k ≥ 2。

六、实验过程及代码

Sobel算子

 I=imread('a3.jpg'); %读取图像
I1=rgb2gray(I); %将彩色图变成灰色图
subplot(131),imshow(I1),title('原图');

model=[-1,0,1;
       -2,0,2;
       -1,0,1];
[m,n]=size(I1);
I2=double(I1);

for i=2:m-1
    for j=2:n-1
        I2(i,j)=I1(i+1,j+1)+2*I1(i+1,j)+I1(i+1,j-1)-I1(i-1,j+1)-2*I1(i-1,j)-I1(i-1,j-1);
    end
end
subplot(132),
imshow(I2),title('边缘提取后的图像');
I2 = I2 + double(I1);
subplot(133),
imshow(uint8(I2)),title('锐化后的图像');

Robert算子

 I=imread('a3.jpg'); %读取图像
I1=rgb2gray(I); %将彩色图变成灰色图
subplot(131),imshow(I1),title('原图');
model=[0,-1;1,0];
[m,n]=size(I1);
I2=double(I1);
for i=2:m-1
    for j=2:n-1
        I2(i,j)=I1(i+1,j)-I1(i,j+1);
    end
end
subplot(132),imshow(I2),title('边缘提取后的图像');
I2 = I2 + double(I1);

subplot(133),
imshow(uint8(I2)),title('锐化后的图像');

Prewitt算子

 I=imread('a3.jpg');
I1=rgb2gray(I); %将彩色图变成灰色图
subplot(131);
imshow(I1),title('原图');
model=[-1,0,1;
-1,0,1;
-1,0,1];
[m,n]=size(I1);
I2=I1;
for i=2:m-1
for j=2:n-1
tem=I1(i-1:i+1,j-1:j+1);
tem=double(tem).*model;

I2(i,j)=sum(sum(tem));
end
end
subplot(132),
imshow(uint8(I2)),title('边缘提取后的图像');
I2=I2+I1;
subplot(133),
imshow(I2),title('图像锐化')

laplacian算子

I=imread('a3.jpg'); 
I1=mat2gray(I);%实现图像矩阵的归一化操作
[m,n]=size(I1);
newGrayPic=I1;%为保留图像的边缘一个像素
LaplacianNum=0;%经Laplacian算子计算得到的每个像素的值
LaplacianThreshold=0.2;%设定阈值
for j=2:m-1 %进行边界提取
    for k=2:n-1
        LaplacianNum=abs(4*I1(j,k)-I1(j-1,k)-I1(j+1,k)-I1(j,k+1)-I1(j,k-1));
        if(LaplacianNum > LaplacianThreshold)
            newGrayPic(j,k)=255;
        else
            newGrayPic(j,k)=0;
        end
    end
end
I2=rgb2gray(I); %将彩色图变成灰色图
subplot(131),imshow(I2),title('原图');
subplot(132),
imshow(newGrayPic);
title('Laplacian算子的处理结果')
t=I1+newGrayPic;
subplot(133),imshow(t),title('图像锐化后')

Log算子

 t=imread('a3.jpg');
t=rgb2gray(t);
[m,n]=size(t);
subplot(1,3,1),imshow(t),title('原图')
tt=t;
model=[0,0,1,0,0; 
 0,1,2,1,0;
1,2,-16,2,1;
0,0,1,0,0;
0,1,2,1,0;]


for i=3:m-2
for j=3:n-2
    tem=double(t(i-2:i+2,j-2:j+2)).*model;
    x=sum(sum(tem));
   tt(i,j)=x;
end
end

subplot(1,3,2),imshow(tt),title('log提取边缘后')
t_1=double(tt)+double(t);
subplot(1,3,3),imshow(uint8(t_1)),title('log锐化后')

七、实验结果与分析

Sobel算子
在这里插入图片描述
在这里插入图片描述
Robert算子

在这里插入图片描述
在这里插入图片描述

Prewitt算子

在这里插入图片描述
在这里插入图片描述

laplacian算子

在这里插入图片描述
在这里插入图片描述

Log算子
在这里插入图片描述
在这里插入图片描述
总结
    图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。我的理解:图像锐化就是通过使得图像的边缘更加突出,可以是原图与原图的高频部分叠加而成。
    Sobel算法与Priwitt算法的思路相同,属于同一类型,因此处理效果基本相同。Roberts算法的模板为2*2,提取信息较弱。单方向锐化经过处理之后,也可以对边界进行增强。Laplacian算子对噪声比较敏感,Laplacian算子有一个缺点是它对图像中的某些边缘产生双重响应。所以图像一般先经过平滑处理,通常把Laplacian算子和平滑算子结合起来生成一个新的模板-Log算子。

八、实验总结及心得体会

    通过此次实验,自己学习了图像锐化的几种算子。开始的时候,不懂每个算子的来源,后面看了老师的推导过程后,发现其实锐化就是先对图像进行差分(类似求导),再叠加到原图上。这里主要的问题就是对算子的差分原理的验证,然后在MATLAB上机过程中,没有注意到数据类型的限制,导致数据上溢。

更多

获取更多资料、代码,微信公众号:海轰Pro
回复 海轰 即可

2015-02-06 10:02:21 xiaojun111111 阅读数 1005

含笑:这个原理倒是容易理解,不过处理大一点的图像有问题,可能是我的代码有问题,速度慢。

 

注:所有图像处理所使用到的图片来自陈京东先生拍摄的,a promising remarkble photographer in China. Thank you!

 

锐化原理:

图像的锐化就是要显示图像中有关形体的边缘。所谓形体的边缘就是图像像素点的颜色值发生显著变化的地方,在图像的平淡区,这种颜色值的变化比较平缓,而在图像的边缘区域这种变化相当明显。
也就是说在平缓区,相邻两像素的颜色值的差值较小,而在边缘区域,相邻两像素的颜色值变化抖得多,因而在边缘区域处理这个数值可以使突出效果更加突出,而在非边缘区域而使图像变得较暗,即图像的锐化。拉普拉斯模块法

 

原始图片: 

   图像处理——锐化

 

经过锐化处理后的图片为:

 

图像处理——锐化

 

锐化的代码如下:

            int Height = bmp_old.Height;
            int Width = bmp_old.Width;
            Bitmap bitmap = new Bitmap(Width, Height);
            Bitmap MyBitmap = (Bitmap)bmp_old;
            Color pixel;
            //拉普拉斯模板
            int[] Laplacian ={ -1, -1, -1, -1, 9, -1, -1, -1, -1 };
            for (int x = 1; x < Width - 1; x++)
                for (int y = 1; y < Height - 1; y++)
                {
                    int r = 0, g = 0, b = 0;
                    int Index = 0;
                
                    for (int col = -1; col <= 1; col++)
                        for (int row = -1; row <= 1; row++)
                        {
                            pixel = MyBitmap.GetPixel(x + row, y + col);
                            r += pixel.R * Laplacian[Index];
                            g += pixel.G * Laplacian[Index];
                            b += pixel.B * Laplacian[Index];
                            Index++;
                        }
                    //处理颜色值溢出
                    r = r > 255 ? 255 : r;
                    r = r < 0 ? 0 : r;
                    g = g > 255 ? 255 : g;
                    g = g < 0 ? 0 : g;
                    b = b > 255 ? 255 : b;
                    b = b < 0 ? 0 : b;
                    bitmap.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));
                }

            Form3 output2 = new Form3(bitmap, "锐化");
            output2.MdiParent = this;
            output2.Show();

2015-08-12 21:40:51 zhangchen1003 阅读数 366

图像锐化原理:
下面我们进行一个简单的滤波操作,滤波算子为[0 –1 0;-1 5 –1;0 –1 0],它可以让图像变得尖锐,而边缘更加突出。核心公式即:
sharp(i.j)=5*image(i,j)-image(i-1,j)-image(i+1,j)-image(i,j-1)-image(i,j+1)

 版本一:
图像遍历使用三个指针,一个指向当前行、一个指向前一行、一个指向后一行,由于每个像素值计算都需要它的上下左右四个领域像素值,所以不可能对图像的第一行、最后一行、第一列、最后一列进行计算。具体代码如下:
#include<iostream>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;

void sharpen(Mat& image,Mat& result){
    result.create(image.size(),image.type());
    for(int i=1;i<image.rows-1;i++){
        const uchar* current=image.ptr<const uchar>(i);
        const uchar* previous=image.ptr<const uchar>(i-1);
        const uchar* next=image.ptr<const uchar>(i+1);
        uchar* data_out=result.ptr<uchar>(i);
        for(int j=0;j<image.cols-1;j++){
            if(image.channels()==1)
            {
                data_out[j]=saturate_cast<uchar>(5*current[j]-current[j+1]-current[j-1]-previous[j]-next[j]);
            }
            else if(image.channels()==3)
            {
                *(data_out + j*image.elemSize()) =saturate_cast<uchar>(5 * *(current + j*image.elemSize()) - *(current + (j-1)*image.elemSize())- *(current + (j+1)*image.elemSize()) - *(previous + j*image.elemSize())- *(next + j*image.elemSize()));  
                *(data_out + j*image.elemSize() + 1) = saturate_cast<uchar>(5 * *(current + j*image.elemSize() + 1) - *(current + (j-1)*image.elemSize() + 1)- *(current + (j+1)*image.elemSize() + 1) - *(previous + j*image.elemSize() + 1)- *(next + j*image.elemSize() + 1));  
                *(data_out + j*image.elemSize() + 2) = saturate_cast<uchar>(5 * *(current + j*image.elemSize() + 2) - *(current + (j-1)*image.elemSize() + 2)- *(current + (j+1)*image.elemSize() + 2) - *(previous + j*image.elemSize() + 2)- *(next + j*image.elemSize() + 2));  

            }
        }
        if(image.channels()==0)
        {
            result.row(0).setTo(Scalar(0));
            result.row(result.rows-1).setTo(Scalar(0));
            result.col(0).setTo(Scalar(0));
            result.col(result.cols-1).setTo(Scalar(0));
        }
        else if(image.channels()==3)
        {
            result.row(0).setTo(Scalar(0,0,0));
            result.row(result.rows-1).setTo(Scalar(0,0,0));
            result.col(0).setTo(Scalar(0,0,0));
            result.col(result.cols-1).setTo(Scalar(0,0,0));

        }
    }
}

int main(){
    Mat image=imread("F:\\opencv_test\\1.jpg",0);
    cout<<image.channels()<<endl;
    Mat result;
    double dur;
    dur=static_cast<double>(getTickCount());
    sharpen(image,result);
    dur=static_cast<double>(getTickCount())-dur;
    dur/=getTickFrequency();
    cout<<dur;

    namedWindow("1");
    imshow("1",result);
    namedWindow("2");
    imshow("2",image);
    waitKey(0);
    return 0;
}
版本二:调用Opencv中定义的函数filter2D完成,在使用它之前需要先定义一个矩阵模版,然后以一副图像和这个模板为参数,返回滤波后的图像;具体代码如下:
int main(){
    Mat kernals(3,3,CV_32F,Scalar(0));
    kernals.at<float>(0,1)=-1.0;
    kernals.at<float>(1,1)=5.0;
    kernals.at<float>(1,0)=-1.0;
    kernals.at<float>(1,2)=-1.0;
    kernals.at<float>(2,1)=-1.0;
    Mat image=imread("F:\\opencv_test\\1.jpg");
    cout<<image.channels()<<endl;

    Mat result;
    filter2D(image,result,image.depth(),kernals);
    namedWindow("1");
    imshow("1",result);
    namedWindow("2");
    imshow("2",image);
    waitKey(0);
    return 0;

}

图像的简单算术运算
(1)注:需要图像的尺寸和类型相同
// c[i]= k1*a[1]+k2*b[i]+k3;
cv::addWeighted(imageA,k1,imageB,k2,k3,resultC);
(2)等价写法:
result= 0.7*image1+0.9*image2;

2019-07-10 09:02:31 weixin_44355157 阅读数 67

基于FPGA的图像拉普拉斯锐化处理

AT7_Xilinx开发板(USB3.0+LVDS)资料共享
腾讯链接:https://share.weiyun.com/5GQyKKc
百度网盘链接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw
提取码:qr0t

在这里插入图片描述

1系统概述
如图所示,这是整个视频采集系统的原理框图。上电初始,FPGA需要通过IIC接口对CMOS Sensor进行寄存器初始化配置。这些初始化的基本参数,即初始化地址对应的初始化数据都存储在一个预先配置好的FPGA片内ROM中。在初始化配置完成后,CMOS Sensor就能够持续输出标准RGB的视频数据流,FPGA通过对其同步信号,如时钟、行频和场频进行检测,从而从数据总线上实时的采集图像数据。MT9V034摄像头默认初始化数据就能输出正常的视频流,因此FPGA中实际上未作任何IIC初始化配置。
在FPGA内部,采集到的视频数据先通过一个FIFO,将原本25MHz频率下同步的数据流转换到50MHz的频率下。接着将这个数据再送入写DDR3缓存的异步FIFO中,这个FIFO中的数据一旦达到一定数量,就会写入DDR3中。与此同时,读取DDR3中缓存的图像数据,缓存到FIFO中,并最终送往LCD驱动模块进行显示。LCD驱动模块不断的发出读图像数据的请求,并驱动液晶显示器显示视频图像。
本实例除了前面提到对原始图像做DDR3缓存和显示,还会在原始图像缓存到DDR3之前,另外做图像的多行缓存和拉普拉斯锐化处理,获得新的锐化后的图像流,这个图像流写入到DDR3中。根据LCD显示模块的请求,读取DDR3中处理后的图像进行显示。最终在VGA液晶显示器上,可以看到左侧图像是原始的图像,右侧图像是经过锐化处理后的图像。
在这里插入图片描述

2图像拉普拉斯锐化
2.1 基本概念
在图像增强中,平滑是为了消除图像中噪声的干扰,或者降低对比度。与之相反,有时为了强调图像的边缘和细节,需要对图像进行锐化,提高对比度。
拉普拉斯锐化图像是根据图像某个像素的周围像素到此像素的突变,也就是说它的依据是图像像素的变化程度。我们知道,一个函数的一阶微分描述了函数图像是朝哪里变化的,即增长或者降低;而二阶微分描述的则是图像变化的速度,急剧增长下降还是平缓的增长下降。那么据此我们可以猜测出依据二阶微分能够找到图像的色素的过渡程度,例如白色到黑色的过渡就是比较急剧的。
或者用官方点的话说:当邻域中心像素灰度低于它所在的领域内其它像素的平均灰度时,此中心像素的灰度应被进一步降低,当邻域中心像素灰度高于它所在的邻域内其它像素的平均灰度时,此中心像素的灰度应被进一步提高,以此实现图像的锐化处理。
2.2拉普拉斯(laplace)算子
最常用的无方向性的二阶差分算子,其模板有33、55和77等多种形式。。
例如,以3
3算子为例,1~8像素是(x,y)点周围邻近的8个像素点。可以使用右侧的2种模板对(x,y)以及周边4或8个像素点进行运算,替代原来的(x,y)点。在这里插入图片描述在这里插入图片描述在这里插入图片描述

当然了,根据中心点的权重程度,也可以使用如下2中模板来实现图像锐化。
		 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190710090129340.jpg)![在这里插入图片描述](https://img-blog.csdnimg.cn/2019071009013699.jpg)

2.3Matlab实现
基于第一种拉普拉斯锐化处理,我们的Matlab代码如下:
在这里插入图片描述
clear
clc
I1=imread(’.\lena.jpg’);
I=im2double(I1);
[m,n,c]=size(I);
A=zeros(m,n,c);

%for R
for i=2:m-1
for j=2:n-1
A(i,j,1)=I(i+1,j,1)+I(i-1,j,1)+I(i,j+1,1)+I(i,j-1,1)-4*I(i,j,1);
end
end

%for G
for i=2:m-1
for j=2:n-1
A(i,j,2)=I(i+1,j,2)+I(i-1,j,2)+I(i,j+1,2)+I(i,j-1,2)-4*I(i,j,2);
end
end

%for B
for i=2:m-1
for j=2:n-1
A(i,j,3)=I(i+1,j,3)+I(i-1,j,3)+I(i,j+1,3)+I(i,j-1,3)-4*I(i,j,3);
end
end

B=I-A;

%output
imwrite(B,‘lena.tif’,‘tif’);
imshow(’.\lena.jpg’);title(‘origin image’);figure
imshow(‘lena.tif’);title(‘image after laplace transform’)
滤波效果如下。在这里插入图片描述

Matlab源码、Lena.jpg原图和比对图存放在at7_img_ex02\matlab文件夹下。

3基于FPGA的图像平滑处理
工程文件夹at7_img_ex02\zstar.srcs\sources_1\new下的laplace_transform.v模块实现了拉普拉斯锐化处理。该模块功能框图如下,使用2个FIFO,分别缓存前后行,即进入图像处理的3组数据流分别是第n-1行、第n行和第n+1行的图像,控制输入数据流和2个FIFO缓存的图像在同一个位置、寄存器对前后2个像素的图像值进行缓存,这样便可实现中心像素点以及前后列、上下行之间数据的同步处理了。在这里插入图片描述

AT7_Xilinx开发板(USB3.0+LVDS)资料共享
腾讯链接:https://share.weiyun.com/5GQyKKc
百度网盘链接:https://pan.baidu.com/s/1M7PLzRs-yMJv7NFJE8GVAw
提取码:qr0t

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