• 数字图像处理之素描


     数字图像处理之素描

      这是我的随机信号作业,直接从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);
    

      

  • 相关阅读:
    [转贴]35岁之前成功12条法则
    any type,any name
    The quick brown fox jumps over the lazy dog.
    [总结]软件工程师笔试题目(C++)
    [转]IOCP介绍
    A simple IOCP Server/Client Class
    Flash for Linux
    看看你是否需要更新SYMBOL文件了??
    [转贴]The Code Project Visual C++ Forum FAQ
    (搜集)一些少走弯路的话语+参考信息
  • 原文地址:https://www.cnblogs.com/lan-xin/p/11019917.html
Copyright © 2020-2023  润新知