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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++自定义非极大值抑制(Canny边缘检测,亚像素方法)

發(fā)布時間:2023/12/20 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++自定义非极大值抑制(Canny边缘检测,亚像素方法) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Mat subPixleRestrainNoMax2(Mat img)//具有更清楚的物理解釋,線插分法 {Mat oriImage = img;Mat newImage_x = Mat(img.size(), CV_32SC1, Scalar(0));Mat newImage_y = Mat(img.size(), CV_32SC1, Scalar(0));Mat newImage_xy = Mat(img.size(), CV_32SC2, Scalar(0));//包含梯度信息Mat maxImage = Mat(img.size(), CV_8UC1, Scalar(0));//非極大值抑制后的圖像//對x方向求Sobel算子梯度int width = img.cols;int hight = img.rows;int max_sobel_x = 0;//記錄x方向最大梯度絕對值for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){int nav_value = oriImage.at<uchar>(i + 1, j - 1) + 2 * oriImage.at<uchar>(i, j - 1)+ oriImage.at<uchar>(i - 1, j - 1);int pos_value = oriImage.at<uchar>(i + 1, j + 1) + 2 * oriImage.at<uchar>(i, j + 1)+ oriImage.at<uchar>(i - 1, j + 1);int sobel_result = ((pos_value - nav_value) / 6);//相減除以6//int sobel_result = (pos_value + 6 * 255 - nav_value) / (6 * 2); //把像素加255 再除以 2if (max_sobel_x < abs(sobel_result))max_sobel_x = abs(sobel_result);//找到梯度最大值newImage_x.at<int>(i, j) = sobel_result;}float mulit_x = (float)(255 / max_sobel_x);//按倍數(shù)擴(kuò)大像素值,使像素差距放大for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){newImage_x.at<int>(i, j) = (int)(newImage_x.at<int>(i, j) * mulit_x);}//對y方向求Sobel梯度int max_sobel_y = 0;//記錄最大y方向梯度絕對值for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){int nav_value = oriImage.at<uchar>(i - 1, j - 1) + 2 * oriImage.at<uchar>(i - 1, j)+ oriImage.at<uchar>(i - 1, j + 1);int pos_value = oriImage.at<uchar>(i + 1, j - 1) + 2 * oriImage.at<uchar>(i + 1, j)+ oriImage.at<uchar>(i + 1, j + 1);int sobel_result = ((pos_value - nav_value) / 6);//相減除以6//int sobel_result = (pos_value + 6 * 255 - nav_value) / (6 * 2); //把像素加255 再除以 2if (abs(sobel_result) > max_sobel_y)max_sobel_y = abs((sobel_result));//找到梯度最大值newImage_y.at<int>(i, j) = sobel_result;}float mulit_y = (float)(255 / max_sobel_y);//按倍數(shù)擴(kuò)大像素值,使像素差距放大for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){newImage_y.at<int>(i, j) = (int)(newImage_y.at<int>(i, j) * mulit_y);}//把每個像素的梯度值和梯度方向存入到newImage_xy中float direct_value;float pi = 3.141;for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){newImage_xy.at<Vec2i>(i, j)[0] = (abs(newImage_x.at<int>(i, j)) + abs(newImage_y.at<int>(i, j))) / 2;}//非極大值抑制處理,使用亞像素線插分方法for (int i = 1; i < hight - 1; i++)for (int j = 1; j < width - 1; j++){//case1具體原理見筆記if ((((newImage_x.at<int>(i, j) > 0) && (newImage_y.at<int>(i, j) < 0))|| ((newImage_x.at<int>(i, j) < 0) && (newImage_y.at<int>(i, j) > 0)))&& (abs(newImage_x.at<int>(i, j)) > abs(newImage_y.at<int>(i, j)))){float weight = abs((float)newImage_y.at<int>(i, j) / (float)newImage_x.at<int>(i, j));//計算沿梯度向前一個像素的插分值int front = weight * newImage_xy.at<Vec2i>(i - 1, j + 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i, j + 1)[0];//計算沿梯度向后的一個插分值int back = weight * newImage_xy.at<Vec2i>(i + 1, j - 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i, j - 1)[0];//判斷是否是最大值if ((newImage_xy.at<Vec2i>(i, j)[0] > front) && (newImage_xy.at<Vec2i>(i, j)[0] < back))maxImage.at<uchar>(i, j) = newImage_xy.at<Vec2i>(i, j)[0];}//case2if ((((newImage_x.at<int>(i, j) > 0) && (newImage_y.at<int>(i, j) < 0))|| ((newImage_x.at<int>(i, j) < 0) && (newImage_y.at<int>(i, j) > 0)))&& (abs(newImage_x.at<int>(i, j)) < abs(newImage_y.at<int>(i, j)))){float weight = abs((float)newImage_x.at<int>(i, j) / (float)newImage_y.at<int>(i, j));//計算沿梯度向前一個像素的插分值int front = weight * newImage_xy.at<Vec2i>(i - 1, j + 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i-1, j )[0];//計算沿梯度向后的一個插分值int back = weight * newImage_xy.at<Vec2i>(i + 1, j - 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i+1, j )[0];//判斷是否是最大值if ((newImage_xy.at<Vec2i>(i, j)[0] > front) && (newImage_xy.at<Vec2i>(i, j)[0] < back))maxImage.at<uchar>(i, j) = newImage_xy.at<Vec2i>(i, j)[0];}//case3if ((((newImage_x.at<int>(i, j) > 0) && (newImage_y.at<int>(i, j) > 0))|| ((newImage_x.at<int>(i, j) < 0) && (newImage_y.at<int>(i, j) < 0)))&& (abs(newImage_x.at<int>(i, j)) > abs(newImage_y.at<int>(i, j)))){float weight = abs((float)newImage_y.at<int>(i, j) / (float)newImage_x.at<int>(i, j));//計算沿梯度向前一個像素的插分值int front = weight * newImage_xy.at<Vec2i>(i +1, j + 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i, j+1)[0];//計算沿梯度向后的一個插分值int back = weight * newImage_xy.at<Vec2i>(i - 1, j - 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i, j-1)[0];//判斷是否是最大值if ((newImage_xy.at<Vec2i>(i, j)[0] > front) && (newImage_xy.at<Vec2i>(i, j)[0] < back))maxImage.at<uchar>(i, j) = newImage_xy.at<Vec2i>(i, j)[0];}//case4if ((((newImage_x.at<int>(i, j) > 0) && (newImage_y.at<int>(i, j) > 0))|| ((newImage_x.at<int>(i, j) < 0) && (newImage_y.at<int>(i, j) < 0)))&& (abs(newImage_x.at<int>(i, j)) < abs(newImage_y.at<int>(i, j)))){float weight = abs((float)newImage_x.at<int>(i, j) / (float)newImage_y.at<int>(i, j));//計算沿梯度向前一個像素的插分值int front = weight * newImage_xy.at<Vec2i>(i + 1, j + 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i+1, j)[0];//計算沿梯度向后的一個插分值int back = weight * newImage_xy.at<Vec2i>(i - 1, j - 1)[0] + (1 - weight) * newImage_xy.at<Vec2i>(i-1, j)[0];//判斷是否是最大值if ((newImage_xy.at<Vec2i>(i, j)[0] > front) && (newImage_xy.at<Vec2i>(i, j)[0] < back))maxImage.at<uchar>(i, j) = newImage_xy.at<Vec2i>(i, j)[0];}//當(dāng)x方向梯度為0時else if ((newImage_x.at<int>(i, j) == 0) && (newImage_y.at<int>(i, j) != 0)){if ((newImage_xy.at<Vec2i>(i, j)[0] > newImage_xy.at<Vec2i>(i - 1, j)[0])&& (newImage_xy.at<Vec2i>(i, j)[0] < newImage_xy.at<Vec2i>(i + 1, j)[0]))maxImage.at<uchar>(i, j) = newImage_xy.at<Vec2i>(i, j)[0];}//當(dāng)y方向梯度為0時else if ((newImage_y.at<int>(i, j) == 0) && (newImage_x.at<int>(i, j) != 0)){if ((newImage_xy.at<Vec2i>(i, j)[0] > newImage_xy.at<Vec2i>(i, j - 1)[0])&& (newImage_xy.at<Vec2i>(i, j)[0] < newImage_xy.at<Vec2i>(i, j + 1)[0]))maxImage.at<uchar>(i, j) = newImage_xy.at<Vec2i>(i, j)[0];}}return maxImage; }

總結(jié)

以上是生活随笔為你收集整理的C++自定义非极大值抑制(Canny边缘检测,亚像素方法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产99视频在线 | 爱看av在线 | 91精品国产精品 | 无码一区二区三区在线观看 | 亚洲第二色 | 亚洲一卡二卡三卡 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 日韩三级不卡 | 懂色中文一区二区在线播放 | 91网站大全 | 国产在线播放一区二区 | 亚洲中文字幕无码一区 | 88av网站| 亚洲av无码精品色午夜果冻不卡 | 色免费视频 | 四虎永久在线精品免费网址 | 我要看免费黄色片 | 舐丝袜脚视频丨vk | 欧美黄色一级片视频 | 成人在线视频免费 | 国产免费无遮挡吸奶头视频 | 天天射,天天干 | 国产盗摄精品一区二区酒店 | 欧美视频你懂的 | 婷婷色在线观看 | 亚洲综合免费观看高清完整版在线 | 毛片视频免费播放 | 亚洲h| 动漫av在线播放 | aaa一区二区| 日本黄网免费 | 特黄一区 | 精品无码一区二区三区爱欲 | 在线免费亚洲 | 日本理论片午伦夜理片在线观看 | 一区二区成人在线 | 国产激情视频一区 | 午夜欧美精品久久久久久久 | 成人影视在线看 | 色姑娘av| 催眠调教后宫乱淫校园 | 成人免费毛片嘿嘿连载视频 | a级片在线观看视频 | 黄色av小说在线观看 | 日韩激情在线观看 | 亚洲在线视频观看 | 好吊妞这里只有精品 | 国产精品久久久久桃色tv | 人人插人人 | 久久久96人妻无码精品 | 蜜臀久久99精品久久久无需会员 | 性欧美jzjz2| 九九精品视频在线 | 毛片大片| 国产电影一区二区三区爱妃记 | 亚洲啪啪 | 日本一区二区三区电影在线观看 | 女人下面流白浆的视频 | 免费成人福利视频 | 污污小说在线观看 | 国产精品免费观看视频 | 91传媒在线免费观看 | 久久精品人妻一区二区三区 | av片免费在线播放 | 国产精品区一区二 | 会喷水的亲姐姐 | 97久久人人超碰caoprom欧美 | 成人在线视频播放 | 好吊在线视频 | 黄色片在线视频 | 亚洲欧美网站 | 日韩欧美视频在线免费观看 | 国产精品探花在线观看 | 草草影院在线 | 特大黑人巨人吊xxxx | 人妻巨大乳一二三区 | 青青草视频在线免费观看 | 国产精品久久久久久久久岛 | 日本亚洲色大成网站www久久 | 日本三级理论片 | 久久综合干 | 污污视频网站在线 | 成人美女免费网站视频 | 卡一卡二av | 日韩大片在线观看 | 黄色片子网站 | 亚洲av无码国产精品久久久久 | 亚洲国产综合网 | 国产一级淫片a | 久久精品三级视频 | 中国亚洲老头同性gay男男… | 麻豆传媒在线 | 久久精品无码人妻 | 精品热| 综合网色| 91免费在线播放 | 国产中文字幕乱人伦在线观看 | 久久国产网 | 午夜视频在线免费 |