空间皮肤代码_OpenCV实现皮肤表面粗糙度3D显示
點擊上方藍字關注我們
微信公眾號:OpenCV學堂
關注獲取更多計算機視覺與深度學習知識
問題分析與思路
這個是最近有人問我的一個問題,想把一個拍好的皮膚圖像,轉換為3D粗糙度表面顯示,既然是粗糙度表面顯示,我想到的就是把圖像轉換為灰度圖像,對每個像素點來說,有三個不同維度的信息可以表示它們,分別是坐標x、y與像素灰度值c ,對每個像素點Pixel(x,y ,c)就是一個三維向量,使用matplotlib的的3D表面圖即可實現顯示,這里還另外一個問題需要解決,就是像素的取值范圍在0~255之后,但是為了更好的顯示,需要首先對灰度圖像歸一化像素值范圍到0~1之間。所以完整的步驟跟思路如下:
加載圖像
灰度轉換
歸一化處理
Surface 3D繪制
代碼實現
代碼實現主要是基于OpenCV跟matplotlib-cpp兩個庫,關于這個配置跟簡單使用,這里就不再贅述了,直接看之前的文章即可:
五分鐘學會C++高效圖表繪制神器調用
基于灰度圖像實現3D表面繪制的完整代碼如下:
Mat?image?=?imread("D:/images/skin.png");// resizeMat src;float rate = 256.0 / max(image.rows, image.cols);resize(image, src, Size(image.cols*rate, image.rows*rate));// 轉換為灰度圖像Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);normalize(gray, gray, 0, 1, NORM_MINMAX, CV_32F);imshow("input",?src);int h = src.rows;int w = src.cols;std::vector<std::vector<double>> x, y, z;for (int row = 0; row < h; row++) { std::vector<double> x_row, y_row, z_row; for (int col = 0; col < w; col++) { double pv = gray.at<float>(row, col); printf("pv = %.2f \n"); x_row.push_back(col); y_row.push_back(row); z_row.push_back(pv); } x.push_back(x_row); y.push_back(y_row); z.push_back(z_row);}plt::plot_surface(x, y, z);plt::show();waitKey(0);測試一:
測試二:
鑿井者,起于三寸之坎,以就萬仞之深
?推薦閱讀?
OpenCV4系統化學習路線圖-視頻版本!
OpenCV單應性矩陣發現參數估算方法詳解
單應性矩陣應用-基于特征的圖像拼接
OpenCV圖像拼接改進算法之完美拼接
OpenCV | 二值圖像分析的技巧都在這里
OpenCV二值圖像分析之形態學應用技巧
圖像色彩空間與應用轉換
五分鐘學會C++高效圖表繪制神器調用
沒想到圖像直方圖有這么多應用場景
基于灰度共生矩陣(GLCM)的圖像紋理分析與提取
OpenCV中一個最容易搞錯的形態學操作
OpenCV4.x中請別再用HAAR級聯檢測器檢測人臉,有更好更準的方法
總結
以上是生活随笔為你收集整理的空间皮肤代码_OpenCV实现皮肤表面粗糙度3D显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的matplotlib风格_
- 下一篇: q版地图制作软件_Flash动画的图形元