圖像分割-基本邊緣檢測roberts,prewitt,sobel,canny,laplace

執行邊緣檢測的三個基本步驟:
1、為降噪對圖像進行平滑處理。(導數對噪聲具有敏感性。圖像的正負分量檢測困難)
2、邊緣點的檢測。(提取邊緣點的潛在候選者)
3、邊緣定位。(從候選者中選出真是邊緣點成員)
步驟
基本算子:梯度算子(表征某點邊緣強度和方向,又稱邊緣檢測子)
梯度
梯度幅值

較為簡單的邊緣檢測算子模板:
水平和豎直分量
45度和135度分量
sobel模板能較好地抑制噪聲。
常用絕對值來近似梯度幅值,保持灰度級的相對變化,代價是導致濾波器不再是各向同性的。
近似梯度幅值

sobel計算過程


Opencv庫函數調用方法:

void Sobel (
InputArray src,
OutputArray dst,
int ddepth,
int dx, x方向上的差分階數
int dy, y方向上的差分階數
int ksize=3, 核的大小,為奇數
double scale=1, 計算導數時的縮放因子
double delta=0, 將結果存入目標圖像前可選的值
int borderType=BORDER_DEFAULT ) ;
在這里插入圖片描述

int main()
{// Read image 讀取圖像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字體為綠色//載入原圖Mat srcImage = imread("D:\\opencv_picture_test\\形態學操作\\coin_inv.png",0);	//讀取灰度圖//判斷圖像是否加載成功if (srcImage.empty()){cout << "圖像加載失敗!" << endl;return -1;}elsecout << "圖像加載成功!" << endl << endl;Mat gradx, grady;Mat abs_gradx, abs_grady;Mat dstImage;//求x方向的梯度Sobel(srcImage,gradx,CV_16S,1,0,3,1,1,BORDER_DEFAULT);//	x方向1階差分 y方向0 核大小3convertScaleAbs(gradx, abs_gradx);		//絕對值//求y方向的梯度Sobel(srcImage, grady, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);//	x方向1階差分 y方向0 核大小3convertScaleAbs(grady, abs_grady);		//絕對值addWeighted(abs_gradx,0.5, abs_grady,0.5,0,dstImage);imshow("srcImage", srcImage);imshow("x方向", abs_gradx);imshow("y方向", abs_grady);imshow("整體", dstImage);waitKey(0);return 0;
}

效果
總覽
經過ImageWatch放大發現,提取出的邊緣比較粗。
放大
減少精密細節的兩種方法:
1、對圖像進行平滑處理(例如用均值濾波,得到主要邊緣)
2、對梯度圖像進行閾值處理(梯度幅值大于等于閾值為黑白,小于閾值為黑),不過這一方法容易斷線。
當為了突出主要邊緣并盡可能維護連續性時,平滑處理和閾值處理兩者都要使用。
roberts、prewitt,sobel算子都是以一個或多個模板進行濾波,而未對圖像特性和噪聲內容采取防護措施。

接下來介紹一種最優的邊緣檢測方法:canny算子

●低錯誤率:標識出盡可能多的實際邊緣,同時盡可能地減少噪聲產生的誤報。
●高定位性:標識出的邊緣要與圖像中的實際邊緣盡可能接近。
●最小響應:圖像中的邊緣只能標識-一次,并且可能存在的圖像噪聲不應標
識為邊緣。

canny算子計算過程

描述
Opencv庫函數調用方法:

void Canny (InputArray image , OutputArray edges, double threshold1,
double threshold2 , 兩個閾值較小的用于邊緣連接,較大的用于控制強邊緣的初始端,一般比例控制在3:1或者2:1
int apertureSize=3, sobel核大小
bool L2gradient=false )

int main()
{// Read image 讀取圖像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字體為綠色//載入原圖Mat srcImage = imread("D:\\opencv_picture_test\\形態學操作\\coin_inv.png",0);	//讀取灰度圖//判斷圖像是否加載成功if (srcImage.empty()){cout << "圖像加載失敗!" << endl;return -1;}elsecout << "圖像加載成功!" << endl << endl;Mat dstImage;Canny(srcImage,dstImage,100,33,3,false);imshow("srcImage", srcImage);imshow("整體", dstImage);waitKey(0);return 0;
}

效果:
效果
經過ImageWatch放大,可以發現,邊緣只有一格
放大
總的看來,canny算子確實具有優越性。

laplace計算過程

1
3*3孔徑的模板:
模板
opencv庫函數調用:
參數


int main()
{// Read image 讀取圖像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);		//字體為綠色//載入原圖Mat srcImage = imread("D:\\opencv_picture_test\\形態學操作\\coin_inv.png", 0);	//讀取灰度圖//判斷圖像是否加載成功if (srcImage.empty()){cout << "圖像加載失敗!" << endl;return -1;}elsecout << "圖像加載成功!" << endl << endl;Mat dstImage,abs_dst;GaussianBlur(srcImage,srcImage,Size(3,3),0);	//高斯模糊Laplacian(srcImage,dstImage,CV_16S,3,1,0);convertScaleAbs(dstImage, abs_dst);imshow("srcImage", srcImage);imshow("整體", dstImage);waitKey(0);return 0;
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378801.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378801.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378801.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

goroutine并發掃描MySQL表_goroutine 并發之搜索文件內容

golang并發編程 - 例子解析February 26, 2013最近在看《Programming in Go》, 其中關于并發編程寫得很不錯, 受益非淺, 其中有一些例子是需要多思考才能想明白的, 所以我打算記錄下來, 強化一下思路《Programming in Go》在 Chapter 7. Concurrent Programming 里面一共用3個例…

軟件開發模型和軟件過程模型_什么是軟件和軟件過程?

軟件開發模型和軟件過程模型軟件 (Software) Software is a set of instructions which instructs the computer for performing different operations. Software is nothing else but a general name for computer programs. 軟件是一組指令&#xff0c;指導計算機執行不同的操…

甲骨文CEO埃里森稱將在Sun裁員1000人

據國外網站報道&#xff0c;甲骨文CEO拉利埃里森周三表示&#xff0c;在完成對Sun的收購后&#xff0c;將對該公司裁員1000人。不過他同時也表示&#xff0c;未來幾個月還要新雇2000人加強Sun的業務。 分析師們曾預測甲骨文完成收購后&#xff0c;將在Sun大裁員。不過埃里森和甲…

改變Jupyter的默認項目路徑

開始接觸Jupyter&#xff0c;看見它默認的工作路徑是C盤&#xff0c;很難受想換下工作空間路徑 管理員身份打開你的Anaconda Prompt 輸入jupyter notebook --generate-config&#xff0c;找到你的配置文件位置 修改一下路徑即可 一般情況到這一步就已經修改成功了&#xff…

arm-linux-gcc/ld/objcopy/objdump使用總結[zz]

地址&#xff1a;http://hi.baidu.com/xiaoyue1800/item/a11a2c4a26da4b04c11613d9arm-linux工具的功能如下&#xff1a;arm-linux-addr2line 把程序地址轉換為文件名和行號。在命令行中給它一個地址和一個可執行文件名&#xff0c;它就會使用這個可執行文件的調試信息指出在給…

圖像分割-LOG檢測器和DOG檢測器

邊緣檢測是以較小的算子為基礎的&#xff0c;具有兩個建議 1、灰度變化與圖像尺寸無關&#xff0c;因此檢測要求使用不同尺寸的算子。 2、灰度的突然變化會在一階導數產生波峰波谷&#xff0c;在二階導數產生零交叉 大的算子檢測模糊邊緣&#xff0c;小的算子檢測銳度集中的細節…

java const string_深入研究Java String

開始寫 Java 一年來&#xff0c;一直都是遇到什么問題再去解決&#xff0c;還沒有主動的深入的去學習過 Java 語言的特性和深入閱讀 JDK 的源碼。既然決定今后靠 Java吃飯&#xff0c;還是得花些心思在上面&#xff0c;放棄一些打游戲的時間&#xff0c;系統深入的去學習。Java…

python 示例_帶有示例的Python字典update()方法

python 示例字典update()方法 (Dictionary update() Method) update() method is used to update the dictionary by inserting new items to the dictionary. update()方法用于通過將新項目插入字典來更新字典。 Syntax: 句法&#xff1a; dictionary_name.setdefault(itera…

Rsync 使用指南

Rsync是個相當棒的同步工具&#xff0c;比如&#xff1a;1. 如何做本地兩個目錄之間的同步&#xff1f;rsync -av --delete --force ~/Desktop/Miscs/ /media/disk/DesktopMiscs 這樣就可以做~/Desktop/Miscs目錄的鏡像了。/media/disk是我的移動硬盤的掛載點。這里關鍵有個問題…

C++——統計多行單個字符類型個數

鍵盤輸入n個字符&#xff0c;請分別統計大寫字母、小寫字母、數字、其他字符的個數并輸出&#xff1b;還需要輸出所有數字字符之和 【輸入形式】 第一行為一個整數n(100 > n > 0)&#xff0c;接下來n行每行一個字符 【輸出形式】 輸出第1行為4個整數&#xff0c;分別…

安卓項目4

經歷兩天的琢磨&#xff0c;終于把android連接服務器端php&#xff0c;讀取mysql這一塊弄好了。 先說說這幾天遇到的問題。 http://wenku.baidu.com/view/87ca3bfa700abb68a982fbca.html 這是我參照的資料&#xff0c;原先我一度認為是不能實例化ServiceLink類&#xff0c;后來…

system getenv_Java System類getenv()方法及示例

system getenv系統類getenv()方法 (System class getenv() method) getenv() method is available in java.lang package. getenv()方法在java.lang包中可用。 getenv() method is used to return an unmodifiable Map of the current environment variable in key-value pairs…

用ASP獲取客戶端IP地址的方法

要想透過代理服務器取得客戶端的真實IP地址&#xff0c;就要使用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 來讀取。不過要注意的事&#xff0c;并不是每個代理服務器都能用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 來讀取客戶端的真實…

C++——已知a+b、 a+c、b+c、 a+b+c,求a、b、 c

有三個非負整數a、b、 C,現按隨機順序給出它們的兩兩和以及總和4個整數&#xff0c;即ab、 ac、bc、 abc, 注意,給出的4個數的順序是隨機的&#xff0c;請根據這四個數求出a、b、c是多少? [輸入形式] 輸入為一-行4個正整數, x1、 x2、x3、 x4 (0≤xi≤10^9) &#xff0c;表示…

DDD:DomainEvent、ApplicationEvent、Command

Command&#xff1a;縱向傳遞&#xff0c;跨分層&#xff0c;在控制器層和應用層之間傳遞。 DomainEvent&#xff1a;橫向傳遞&#xff0c;跨聚合&#xff0c;在一個DLL中。 ApplicationEvent&#xff1a;橫向傳遞&#xff0c;跨模塊&#xff0c;在不同的DLL中。轉載于:https:/…

表示和描述-邊界追蹤

邊界追蹤目標&#xff1a; 輸入&#xff1a;某一區域的點 輸出&#xff1a;這一區域的點的坐標序列&#xff08;順時針或逆時針&#xff09; Moore邊界追蹤法&#xff1a; 兩個前提條件&#xff1a; 1、圖像為二值化后的圖像&#xff08;目標為1&#xff0c;背景為0&#xff0…

視頻的讀取與處理

讀取本地視頻&#xff0c;以灰度視頻輸出 import cv2vc cv2.VideoCapture(E:\Jupyter_workspace\study\data/a.mp4)#視頻路徑根據實際情況而定#檢查是否打開正確 if vc.isOpened():open,fream vc.read()#read()返回兩個參數&#xff0c;第一個參數為打開成功與否True or Fal…

更靈活的定位內存地址的方法05 - 零基礎入門學習匯編語言36

第七章&#xff1a;更靈活的定位內存地址的方法05 讓編程改變世界 Change the world by program 問題7.8 [codesyntax lang"asm"] assume cs:codesg,ds:datasg datasg segment db ibm db dec db dos db vax …

nextgaussian_Java Random nextGaussian()方法與示例

nextgaussian隨機類nextGaussian()方法 (Random Class nextGaussian() method) nextGaussian() method is available in java.util package. nextGaussian()方法在java.util包中可用。 nextGaussian() method is used to generate the next pseudo-random Gaussian double valu…