日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

灰度图像--图像增强 Robert算子、Sobel算子

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 灰度图像--图像增强 Robert算子、Sobel算子 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
灰度圖像--圖像增強 Robert算子、Sobel算子 ???????

目錄(?)[+]

  • 開篇廢話
  • 圖像梯度介紹
  • Robert算子
  • Sobel算子
  • 代碼
  • 結果
  • 總結
  • 學習DIP第36天

    轉載請標明本文出處:http://blog.csdn.net/tonyshengtan,歡迎大家轉載,發現博客被某些論壇轉載后,圖像無法正常顯示,無法正常表達本人觀點,對此表示很不滿意。有些網站轉載了我的博文,很開心的是自己寫的東西被更多人看到了,但不開心的是這段話被去掉了,也沒標明轉載來源,雖然這并沒有版權保護,但感覺還是不太好,出于尊重文章作者的勞動,轉載請標明出處!!!!

    文章代碼已托管,歡迎共同開發:https://github.com/Tony-Tan/DIPpro

    開篇廢話


    ? ? ? ? 繼續廢話,之前介紹了二階微分,和非銳化掩蔽,按照順序該說一階微分了,一階微分與二階微分一樣,是線性算子,線性算子的計算方法多半是生成模板,然后與圖像卷積,一階微分同樣,幾天簡單的介紹兩個一階微分算子,Robert算子和Sobel算子,這兩個算子應該算是大名鼎鼎了,因為這兩個算子在后面的邊緣檢測中都是里程碑似的算法,在增強部分,他們也主要用在邊緣增強,本文只簡要介紹下兩個算子的大概使用和增強效果,具體的數學原理推導和其他性質,將在圖像分割部分完整介紹。

    圖像梯度介紹


    ? ? ? 首先介紹下梯度,梯度并非是一個數值,梯度嚴格意義上是一個向量,這個向量指向當前位置變化最快的方向,可以這么理解,當你站在一個山上,你有360°的方向可以選擇,哪個方向下降速度最快(最陡峭),便是梯度方向,梯度的長度,表示為向量的長度,表示最大的變化速率。 ? ? ? ?梯度的數學表達:
    ? ? ? ?其中表示微分算子。梯度在三維坐標中表示為:
    ? ? ? ?同樣在二維中只取前兩項,也就是由x方向的偏微分和y方向的偏微分組成。對于圖像f中點(x,y)處的梯度,定義為:
    與上面所述保持一致,圖像梯度方向給出圖像變化最快方向,當前點的梯度長度為:
    次長度計算中有平方和開平方,所以將不再是現行操作。 為了簡單計算,將上面求距離簡化成:
    然而上面式子最大的問題在于不具有旋轉不變形,也就是不是各向同性的,具體原因是三角形三遍關系原理,因為梯度方向和長度對于旋轉是不變的,所以,x軸和y軸發生旋轉的時候,直角三角形兩邊發生變化,但保持斜邊長度和方向不變,因此兩個直角邊的長度和必然發生改變,也就是上面的M值必然會改變,顧其不具有旋轉不變形。 ? ? ? ?為了表達方便先重新來定義下模板位置,如下圖

    ? ? ? ? 其中z5表示模板中心。

    Robert算子


    ? ? ? ?奇葩算子Robert,說它奇葩確實奇葩,因為不知道Robert哪來的勇氣或者推導過程,使用一個2x2的模板,而且是對角線做差,其差分為:
    因為向量無法在圖像中顯示,我們要計算梯度向量的長度:
    簡化為絕對值方法:
    這個就是Robert交叉算子。模板:

    Sobel算子


    因為Robert算子是2x2的模板,不是對稱的奇數模板,我們更喜歡3x3的模板,所以,要根據上面的Robert算子改造出來一個3x3模板,提出了下面這個計算方法:
    ? ? ? ?怎么來的?說實話我一開始也不知道,只是說根據上面Robert算子,搞出來一個等價的,其數字模板為:
    ? ? ? ?并且其下降速率(梯度的長度)計算公式:
    ? ? ? ?所有上面的疑惑就是這個公式: ? ? ? ?到底是怎么來的,為什么中間會有2,以及為什么是隔行相減,下面的過程是我自己發明的,沒有數學依據,只是自己的猜測,根據Robert算子的兩個式子,橫向劃過3x3的所有位置,然后相加,就得到了Sobel算子:
    這個過程就用Robert產生了Sobel,同樣的縱向移動就會產生x軸方向的算子。Sobel算子原理的論文不多,但都說這是個很好的邊緣檢測算子。

    代碼


    Robert:

    [cpp] view plaincopyprint?
  • void?Robert(double?*src,double?*dst,int?width,int?height){??
  • ????double?RobertMask_x[9]={0,0,0,0,-1,0,0,0,1};??
  • ????double?RobertMask_y[9]={0,0,0,0,0,-1,0,1,0};??
  • ????double?*dst_x=(double?*)malloc(sizeof(double)*width*height);??
  • ????double?*dst_y=(double?*)malloc(sizeof(double)*width*height);??
  • ????RealConvolution(src,?dst_x,?RobertMask_x,?width,?height,?ROBERT_MASK_SIZE,ROBERT_MASK_SIZE);??
  • ????RealConvolution(src,?dst_y,?RobertMask_y,?width,?height,?ROBERT_MASK_SIZE,ROBERT_MASK_SIZE);??
  • ????for(int?j=0;j<height;j++)??
  • ????????for(int?i=0;i<width;i++){??
  • ????????????dst[j*width+i]=abs(dst_x[j*width+i])+abs(dst_y[j*width+i]);??
  • ??????????????
  • ????????}??
  • ????free(dst_x);??
  • ????free(dst_y);??
  • ??????
  • }??
  • ??
  • void?RobertSharpen(double?*src,double?*dst,int?width,int?height,double?c){??
  • ????Robert(src,dst,width,height);??
  • ????for(int?j=0;j<height;j++)??
  • ????????for(int?i=0;i<width;i++){??
  • ????????????dst[j*width+i]=src[j*width+i]+c*dst[j*width+i];??
  • ????????}??
  • ??????
  • ??????
  • }<span?style="color:#ffffff;">??
  • </span>??
  • void Robert(double *src,double *dst,int width,int height){double RobertMask_x[9]={0,0,0,0,-1,0,0,0,1};double RobertMask_y[9]={0,0,0,0,0,-1,0,1,0};double *dst_x=(double *)malloc(sizeof(double)*width*height);double *dst_y=(double *)malloc(sizeof(double)*width*height);RealConvolution(src, dst_x, RobertMask_x, width, height, ROBERT_MASK_SIZE,ROBERT_MASK_SIZE);RealConvolution(src, dst_y, RobertMask_y, width, height, ROBERT_MASK_SIZE,ROBERT_MASK_SIZE);for(int j=0;j<height;j++)for(int i=0;i<width;i++){dst[j*width+i]=abs(dst_x[j*width+i])+abs(dst_y[j*width+i]);}free(dst_x);free(dst_y);}void RobertSharpen(double *src,double *dst,int width,int height,double c){Robert(src,dst,width,height);for(int j=0;j<height;j++)for(int i=0;i<width;i++){dst[j*width+i]=src[j*width+i]+c*dst[j*width+i];}}<span style="color:#ffffff;"> </span>
    Sobel:

    [cpp] view plaincopyprint?
  • void?Sobel(double?*src,double?*dst,int?width,int?height){??
  • ????double?SobelMask_x[9]={-1,-2,-1,0,0,0,1,2,1};??
  • ????double?SobelMask_y[9]={-1,0,1,-2,0,2,-1,0,1};??
  • ????double?*dst_x=(double?*)malloc(sizeof(double)*width*height);??
  • ????double?*dst_y=(double?*)malloc(sizeof(double)*width*height);??
  • ????RealRelevant(src,?dst_x,?SobelMask_x,?width,?height,?SOBEL_MASK_SIZE,SOBEL_MASK_SIZE);??
  • ????RealRelevant(src,?dst_y,?SobelMask_y,?width,?height,?SOBEL_MASK_SIZE,SOBEL_MASK_SIZE);??
  • ????for(int?j=0;j<height;j++)??
  • ????????for(int?i=0;i<width;i++){??
  • ????????????dst[j*width+i]=abs(dst_x[j*width+i])+abs(dst_y[j*width+i]);??
  • ??????????
  • ????????}??
  • ????free(dst_x);??
  • ????free(dst_y);??
  • ??????
  • }??
  • ??
  • void?SobelSharpen(double?*src,double?*dst,int?width,int?height,double?c){??
  • ????Sobel(src,dst,width,height);??
  • ????for(int?j=0;j<height;j++)??
  • ????????for(int?i=0;i<width;i++){??
  • ????????????dst[j*width+i]=src[j*width+i]+c*dst[j*width+i];??
  • ????????}??
  • ??
  • ??
  • }??
  • void Sobel(double *src,double *dst,int width,int height){double SobelMask_x[9]={-1,-2,-1,0,0,0,1,2,1};double SobelMask_y[9]={-1,0,1,-2,0,2,-1,0,1};double *dst_x=(double *)malloc(sizeof(double)*width*height);double *dst_y=(double *)malloc(sizeof(double)*width*height);RealRelevant(src, dst_x, SobelMask_x, width, height, SOBEL_MASK_SIZE,SOBEL_MASK_SIZE);RealRelevant(src, dst_y, SobelMask_y, width, height, SOBEL_MASK_SIZE,SOBEL_MASK_SIZE);for(int j=0;j<height;j++)for(int i=0;i<width;i++){dst[j*width+i]=abs(dst_x[j*width+i])+abs(dst_y[j*width+i]);}free(dst_x);free(dst_y);}void SobelSharpen(double *src,double *dst,int width,int height,double c){Sobel(src,dst,width,height);for(int j=0;j<height;j++)for(int i=0;i<width;i++){dst[j*width+i]=src[j*width+i]+c*dst[j*width+i];}}


    結果


    原圖:
    Robert:
    Robert Sharpen:
    Sobel: Sobel Sharpen:
    可以觀察出Sobel邊緣較寬,來觀察簡單圖形的Robert和Sobel局部放大圖:
    Robert:
    Sobel:

    Robert局部放大1,2,3:






    Sobel局部放大圖1,2,3:


    ?




    總結

    ? ? ? Sobel和Robert都能對邊緣有較強的響應,而且Sobel對邊緣的響應較寬而且更加強烈,Robert算子對邊緣響應較弱,而且對彎曲的邊緣敏感度第(Robert1中圓形弧形部分亮度低)。 ?待續。。。。 

    總結

    以上是生活随笔為你收集整理的灰度图像--图像增强 Robert算子、Sobel算子的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。