数字图像处理之素描

 数字图像处理之素描

  这是我的随机信号作业,直接从word复制过来的,凑合凑合看吧。

  涉及到的原理主要就是一个sobel边缘提取:

  Sobel算法:

  令 r,g,b 是 RGB 彩色空间沿 R,G,B 轴的单位向量,可定义向量为

        

  数量 定义为这些向量的点乘,如下所示:

         

  利用该表示法,c(x,y)的最大变化率方向可以由角度给出:

        

  (x,y)点在方向上变化率的幅值由下式给出:

     

  过程与方法:

  将Sobel算子的实现划分为五个步骤:

  (1) 计算Gx与Gy与模板每行的乘积。

  (2) 两个3x3矩阵的卷积即将每一行每一列对应相乘然后相加。

  (3) 求得3*3模板运算后的Gx、Gy。

  (4) 求Gx^2 + Gy^2的平方根或者直接对Gx和Gy取绝对值后求和。

  (5)设置一个阈值,运算后的像素值大于该阈值输出为全1,小于该阈值输出为全0。

  结果与分析

       

      图3-1                     图3-2

    

      图3-3 T=180

    

        图3-4  T=230

  分析:

  图3-1,通过sobel算法,提取出图像的边缘细节,边缘部分以白色显示,这是一个二值图像。

  图3-2,3-1图像背景为黑色,不易辨别,也不美观,将背景色换为白色,边缘为黑色显示,如图3-3左上角,但是图片的边缘勾勒不是很清晰,

  于是通过加强边缘的够了,将灰度在一个阈值范围内的灰度进行增强。

  图3-3下面的两个直方图,反映了对应的上方图的灰度等级,左边的直方图由于左上角图偏白,边缘不够清晰,所以灰度值靠近255的居多;

  右边的直方图相比之下,灰度值靠近0的有所增加,边缘更加明显。

  图3-4与3-3相比,由于改变了T的值,提高了对比度,靠近黑色的灰度有所增加。

%白色为255,黑色0
close all;clear all;clc;
f = imread('manhua.jpg');
[VG,A,PPG] = colorgrad(f);
%把图像数据类型转换为无符号八位整型
ppg = im2uint8(PPG);
%由于边缘检测出来的边缘为白色,背景为黑色,
%所以如果想要背景成为白色,边缘成为黑色,需要用255-pgg
ppgf = 255 - ppg;
%[r,c]=size(A)
%将矩阵A的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c
[M,N] = size(ppgf);T=230;
ppgf1 = zeros(M,N);
for ii = 1:M
    for jj = 1:N
        if ppgf(ii,jj)<T %边缘区域
            ppgf1(ii,jj)=0;
        else%平滑区域
            ppgf1(ii,jj)=235/(255-T)*(ppgf(ii,jj)-T);
        end
    end
end
% unit8 255
ppgf1 = uint8(ppgf1);
figure;
subplot(221);imshow(ppgf);
subplot(222);imshow(ppgf1);
subplot(223);imhist(ppgf);
subplot(224);imhist(ppgf1);
figure;imshow(ppgf1);
figure;
imshow(ppg);

  colorgrad.m

%梯度边缘提取算法,计算彩色图像的梯度
%VG是RGB向量梯度Fθ(x, y)
%A是以弧度计的角度θ(x, y)
%PPG是由单独彩色平面的2D梯度之和形成的梯度图像
%输出VG和PPG通过clorgrad被归一化到[0, 1]范围内,并且把它们作为阈值进行处理
%ndims是matlab中求一个数组维数的函数,size(f,3)返回f的行数
function [VG, A, PPG] = colorgrad(f, ~)
if (ndims(f)~=3) || (size(f,3)~=3)              
    error('Input image must be RGB');
end
sh = fspecial('sobel');                          %sobel用于边缘提取
sv = sh';                                        %转置
%r,g,b值 x,y方向, 3个色度卷
%线性空间滤波函数;replicate表示图像大小通过复制外边界的值来扩展,
Rx = imfilter(double(f(:,:,1)), sh, 'replicate');
Ry = imfilter(double(f(:,:,1)), sv, 'replicate');
Gx = imfilter(double(f(:,:,2)), sh, 'replicate');
Gy = imfilter(double(f(:,:,2)), sv, 'replicate');
Bx = imfilter(double(f(:,:,3)), sh, 'replicate');
By = imfilter(double(f(:,:,3)), sv, 'replicate');
 
gxx = Rx.^2 + Gx.^2 + Bx.^2;
gyy = Ry.^2 + Gy.^2 + By.^2;
gxy = Rx.*Ry + Gx.*Gy + Bx.*By;
A = 0.5*(atan(2*gxy./(gxx-gyy+eps)));            
%atan计算反正切函数                
%./点除                                          
%如果a、b是矩阵,a./b就是a、b中对应的每个元素相除,得到一个新的矩阵;
%如果a、b是两个数,那么a./b就是普通的除法
%%eps是一个函数,可以返回某一个数N的最小浮点数精度
G1 = 0.5*((gxx+gyy) + (gxx-gyy).*cos(2*A) + 2*gxy.*sin(2*A));  
A = A + pi/2;
G2 = 0.5*((gxx+gyy) + (gxx-gyy).*cos(2*A) + 2*gxy.*sin(2*A));
G1 = G1.^0.5;
G2 = G2.^0.5;
%mat2gray实现图像矩阵的归一化操作
VG = mat2gray(max(G1, G2));            
RG = sqrt(Rx.^2 + Ry.^2);
GG = sqrt(Gx.^2 + Gy.^2);
BG = sqrt(Bx.^2 + By.^2);
PPG = mat2gray(RG + GG + BG);

  

原文地址:https://www.cnblogs.com/lan-xin/p/11019917.html