1. 程式人生 > >影象處理------高斯一階及二階導數計算

影象處理------高斯一階及二階導數計算

影象的一階與二階導數計算在影象特徵提取與邊緣提取中十分重要。一階與二階導數的

作用,通常情況下:

一階導數可以反應出影象灰度梯度的變化情況

二階導數可以提取出影象的細節同時雙響應影象梯度變化情況

常見的運算元有Robot, Sobel運算元,二階常見多數為拉普拉斯運算元,如圖所示:


對於一個1D的有限集合資料f(x) = {1…N}, 假設dx的間隔為1則一階導數計算公式如下:

Df(x) = f(x+1) – f(x-1) 二階導數的計算公式為:df(x)= f(x+1) + f(x-1) – 2f(x);

稍微難一點的則是基於高斯的一階導數與二階導數求取,首先看一下高斯的1D與2D的

公式。一維高斯對應的X階導數公式:


二維高斯對應的導數公式:


二:演算法實現

1.      高斯取樣,基於間隔1計算,計算mask視窗計算,這樣就跟普通的卷積計算差不多

2.      設定sigma的值,本例預設為10,首先計算高斯視窗函式,預設為3 * 3

3.      根據2的結果,計算高斯導數視窗值

4.      卷積計算畫素中心點值。

注意點計算高斯函式一定要以零為中心點, 如果視窗函式大小為3,則表達為-1, 0, 1

三:程式實現關鍵點

1.      歸一化處理,由於高斯計算出來的視窗值非常的小,必須實現歸一化處理。

2.      亮度提升,對X,Y的梯度計算結果進行了亮度提升,目的是讓大家看得更清楚。

3.      支援一階與二階單一方向X,Y偏導數計算

四:執行效果:

高斯一階導數X方向效果


高斯一階導數Y方向效果


五:演算法全部原始碼:

  1. /* 
  2.  * @author: gloomyfish 
  3.  * @date: 2013-11-17 
  4.  *  
  5.  * Title - Gaussian fist order derivative and second derivative filter 
  6.  */
  7. package com.gloomyfish.image.harris.corner;  
  8. import java.awt.image.BufferedImage;  
  9. import com.gloomyfish.filter.study.AbstractBufferedImageOp;  
  10. publicclass GaussianDerivativeFilter extends AbstractBufferedImageOp {  
  11.     publicfinalstaticint X_DIRECTION = 0;  
  12.     publicfinalstaticint Y_DIRECTION = 16;  
  13.     publicfinalstaticint XY_DIRECTION = 2;  
  14.     publicfinalstaticint XX_DIRECTION = 4;  
  15.     publicfinalstaticint YY_DIRECTION = 8;  
  16.     // private attribute and settings
  17.     privateint DIRECTION_TYPE = 0;  
  18.     privateint GAUSSIAN_WIN_SIZE = 1// N*2 + 1
  19.     privatedouble sigma = 10// default
  20.     public GaussianDerivativeFilter()  
  21.     {  
  22.         System.out.println("高斯一階及多階導數濾鏡");  
  23.     }     
  24.     publicint getGaussianWinSize() {  
  25.         return GAUSSIAN_WIN_SIZE;  
  26.     }  
  27.     publicvoid setGaussianWinSize(int gAUSSIAN_WIN_SIZE) {  
  28.         GAUSSIAN_WIN_SIZE = gAUSSIAN_WIN_SIZE;  
  29.     }  
  30.     publicint getDirectionType() {  
  31.         return DIRECTION_TYPE;  
  32.     }  
  33.     publicvoid setDirectionType(int dIRECTION_TYPE) {  
  34.         DIRECTION_TYPE = dIRECTION_TYPE;  
  35.     }  
  36.     @Override
  37.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  38.         int width = src.getWidth();  
  39.         int height = src.getHeight();  
  40.         if ( dest == null )  
  41.             dest = createCompatibleDestImage( src, null );  
  42.         int[] inPixels = newint[width*height];  
  43.         int[] outPixels = newint[width*height];  
  44.         getRGB( src, 00, width, height, inPixels );  
  45.         int index = 0, index2 = 0;  
  46.         double xred = 0, xgreen = 0, xblue = 0;  
  47.         // double yred = 0, ygreen = 0, yblue = 0;
  48.         int newRow, newCol;  
  49.         double[][] winDeviationData = getDirectionData();  
  50.         for(int row=0; row<height; row++) {  
  51.             int ta = 255, tr = 0, tg = 0, tb = 0;  
  52.             for(int col=0; col<width; col++) {  
  53.                 index = row * width + col;  
  54.                 for(int subrow = -GAUSSIAN_WIN_SIZE; subrow <= GAUSSIAN_WIN_SIZE; subrow++) {  
  55.                     for(int subcol = -GAUSSIAN_WIN_SIZE; subcol <= GAUSSIAN_WIN_SIZE; subcol++) {  
  56.                         newRow = row + subrow;  
  57.                         newCol = col + subcol;  
  58.                         if(newRow < 0 || newRow >= height) {  
  59.                             newRow = row;  
  60.                         }  
  61.                         if(newCol < 0 || newCol >= width) {  
  62.                             newCol = col;  
  63.                         }  
  64.                         index2 = newRow * width + newCol;  
  65.                         tr = (inPixels[index2] >> 16) & 0xff;  
  66.                         tg = (inPixels[index2] >> 8) & 0xff;  
  67.                         tb = inPixels[index2] & 0xff;  
  68.                         xred += (winDeviationData[subrow + GAUSSIAN_WIN_SIZE][subcol + GAUSSIAN_WIN_SIZE] * tr);  
  69.                         xgreen +=(winDeviationData[subrow + GAUSSIAN_WIN_SIZE][subcol + GAUSSIAN_WIN_SIZE] * tg);  
  70.                         xblue +=(winDeviationData[subrow + GAUSSIAN_WIN_SIZE][subcol + GAUSSIAN_WIN_SIZE] * tb);  
  71.                     }  
  72.                 }  
  73.                 outPixels[index] = (ta << 24) | (clamp((int)xred) << 16) | (clamp((int)xgreen) << 8) | clamp((int)xblue);  
  74.                 // clean up values for next pixel
  75.                 newRow = newCol = 0;  
  76.                 xred = xgreen = xblue = 0;  
  77.                 // yred = ygreen = yblue = 0;
  78. 相關推薦

    影象處理------計算

    影象的一階與二階導數計算在影象特徵提取與邊緣提取中十分重要。一階與二階導數的作用,通常情況下:一階導數可以反應出影象灰度梯度的變化情況二階導數可以提取出影象的細節同時雙響應影象梯度變化情況常見的運算元有

    opencv影象處理-------濾波

    opencv高斯濾波原理           高斯濾波是一種線性平滑濾波器,運用此濾波器,影象中各個點的畫素值由它鄰域畫素的加權累加值來替換。把鄰域中每個畫素位置對應的權重係數存放在一個矩陣中,矩陣中心的元素對應正在當前正在應用此濾波器的畫素,此

    數字影象處理---模糊詳解

    高斯濾波實際上是一種低通濾波器,也就是說,低波通過,高波濾去。對於影象來講,就是在低頻的部分通過,對於高頻的地方濾去。對影象的邊緣等細節部分進行模糊,這是由高斯模糊的公式的性質決定的。這點,經常在數字影象處理中利用,以在影象模擬影象重打樣等領域進行利用。 那麼

    影象處理中的

    Laplace運算元和Sobel運算元一樣,屬於空間銳化濾波操作。起本質與前面的Spatial Filter操作大同小異,下面就通過Laplace運算元來介紹一下空間銳化濾波,並對OpenCV中提供的Laplacian函式進行一些說明。 數學原理 離散函式導數 離散函式的導數退化成了差分,一維一階差分公式

    影象處理中的

    http://www.cnblogs.com/dengdan890730/p/6145585.html一階導數與二階導數的計算影象I可以看作(x,y)∈N2→N的對映: i=f(x,y). 其中N為正整數.很明顯f在定義域上是不連續的.不連續函式f(x,y)的導數, 嚴格來說

    灰度影象程式碼實現

    #include <stdio.h> #include <iostream> #include <cv.h> #include "opencv2/highgui/highgui.hpp" #include "opencv2/core/co

    貝塞爾曲線介紹推導

    簡介說明貝塞爾曲線(Bézier curve),又稱貝茲曲線或貝濟埃曲線,由法國工程師皮埃爾·貝塞爾(Pierre Bézier)所廣泛發表,當時主要用於汽車主體設計。  通過比例進行不斷地取點,點不斷地匯成一條平滑的曲線。  具體點選請看貝塞爾曲線掃盲。推導很多推導過程,不

    matlab 影象加入噪聲和平滑處理練習

    影象加入高斯噪聲和平滑處理程式碼 a=imread('lena.jpg'); subplot(221); imshow(a); title ('原始影象'); Inoise=imnoise(a,'ga

    梯有N,上樓可以步上,也可以步上。編寫一個程序,計算共有多少中不同的走法?

    技術 告訴 不同的 mis misc 技術分享 blog main print c語言實現,小夥伴們誰要有更好的實現方法,要告訴我呦 #include int main(void) { int f,i,f1=1,f2=2; printf("請輸入樓梯數"); scanf(

    HDI PCB和三如何區分??

    中間 top info -h 三次 位置 sig https inf 一階板,一次壓合即成,可以想像成最普通的板二階板,兩次壓合,以盲埋孔的八層板為例,先做2-7層的板,壓好,這時候2-7的通孔埋孔已經做好了,再加1層和8層壓上去,打1-8的通孔,做成整板.三階板

    影象處理(十影象分割(3)泛函能量LevelSet、snake分割

    一、level set相關理論 基於水平集的影象分割演算法是一種進化版的Snake演算法,也是需要給定初始的輪廓曲線,然後根據泛函能量最小化,進行曲線演化。水平集的方法,用的是一種隱式函式的方法,這個演算法比較難理解,我一年前開始搞這個演算法的時候,雖然知道程式碼怎麼寫,但是它的原理推

    Java伺服器部署基於OpenCV的C++影象處理專案(

    Java伺服器部署基於OpenCV的C++影象處理專案(一) 由於最近專案需要在後臺處理圖片並返回結果給移動端,所以折騰了一週如何將c++程式碼和opencv打包並部署到java伺服器中供後臺呼叫,這裡記錄下詳細過程。 基礎環境 伺服器環境: 阿里雲伺服器 Red Hat 4

    FPGA影象處理入門(

    本人有過多年用FPGA做影象處理的經驗,在此也談一下自己的看法。用FPGA做影象處理最關鍵的一點優勢就是:FPGA能進行實時流水線運算,能達到最高的實時性。因此在一些對實時性要求非常高的應用領域,做影象處理基本就只能用FPGA。例如在一些分選裝置中影象處理基本上用的都是FPGA,因為在其中相機從看到

    【數字影象處理】作業 直方圖均衡化

    作業一 直方圖均衡化 吳政億 151220129 [email protected] (南京大學 電腦科學與技術系, 南京 210093) 實現細節 單通道直方圖均衡化

    【數字影象處理】opencv的安裝vs2017環境的配置

    1.安裝opencv 首先是安裝opencv,我是從官網下的,下載opencv,在官網下載最近的版本即可。 我是windows10系統,下載對應Windows的最新版。 下載後解壓就不說了,解壓後如下(每個版本可能解壓後不太一樣): 然後我們需要修改環境變

    國慶訓練賽第二場 模擬 能否步還原魔方

    兩種情況 一、一開始就還原好 二、要想一步還原  一定是有兩面是好的(且是對立) 上下, 左右, 前後 有兩層 可以發現每層模擬一下順逆時針 會出現重複 所以可以得出結論 一共就3* 2種情況 列舉 #include<iostream> #incl

    數字影象處理筆記():利用OpenCV的Cameo框架搭建實驗環境

    1 - 引言 Python的應用程式可以通過面向物件的方法來實現,OpenCV提供了一個Cameo框架可以捕捉電腦的攝像頭。我們可以通過編寫新增框架裡的類和方法來對攝像頭捕捉到的畫面進行影象處理和實驗,是一個很好的學習方法,下面讓我們來搭建一下這個Cameo框架 2 - 使用mana

    爬臺階問題(每次爬臺階,或者每次爬臺階)

    package leetcode; /*You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how many di

    Python3+OpenCV3影象處理(十)—— 影象金字塔

    簡介:影象金字塔是影象中多尺度表達的一種,最主要用於影象的分割,是一種以多解析度來解釋影象的有效但概念簡單的結構。簡單來說,影象金字塔就是用來進行影象縮放的。 進行影象縮放可以用影象金字塔,也可以使用resize函式進行縮放,後者效果更好。這裡只是對影象金字塔做一些簡單瞭解

    Python機器學習-資料預處理技術 標準化處理、歸化、值化、獨熱編碼、標記編碼總結

    資料預處理技術 機器是看不懂絕大部分原始資料的,為了讓讓機器看懂,需要將原始資料進行預處理。 引入模組和資料 import numpy as np from sklearn import preprocessing data = np.array([[3,-1.5,2,-5.4], &nbs