数字图像处理小练习存档1
生活随笔
收集整理的這篇文章主要介紹了
数字图像处理小练习存档1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小練習的題目:
1、讀取一張圖,分解RGB三個通道
/************練習1**********************/ int main() {Mat img1 = imread("D:\\opencv_picture_test\\miku2.jpg",2|4); //灰度圖if (img1.empty()){printf("Could not find the image!\n");return -1;}std::vector<cv::Mat> channels;cv::split(img1,channels);Mat B = channels.at(0);Mat G = channels.at(1);Mat R = channels.at(2);imshow("blue", B);imshow("green", G);imshow("red", R);waitKey(0);return 0; }2、調用本機攝像頭
/************練習2**********************/ int main() {//實例化的同時初始化//調用攝像頭VideoCapture capture(0); //類似于 int a=1;/*先實例化VideoCapture capture;再初始化capture.open("D:\\opencv_picture_test\\video1.avi");*/while (1){Mat frame; //存儲每一幀的圖像capture >> frame; //讀取當前幀imshow("原視頻", frame); //顯示當前幀//進行腐蝕操作Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //返回的是內核矩陣Mat dstImage;erode(frame, dstImage, element); //腐蝕操作imshow("處理后的視頻", dstImage); //顯示當前幀if(waitKey(10) >= 0) break; //延時10ms}return 0; }3、opencv基本繪圖功能
int main() {Mat displayMat = imread("D:\\opencv_picture_test\\RGB純色圖\\blue.jpg", 0); //灰度圖if (displayMat.empty()){printf("Could not find the image!\n");return -1;}//畫圓Point pt; //圓心pt.x = 90;pt.y = 90;circle(displayMat, pt, 20, CV_RGB(0, 255, 0), 1, 8, 0); //畫圓的目標圖像 圓心的點 圓的半徑 圓的顏色 // 圓的線條粗細,取-1為繪制實心圓 領接關系和偏移,一般設置默認值,8和0//畫線段Point pt1; //起點pt1.x = 100; pt1.y = 100;Point pt2; //終點pt2.x = 300;pt2.y = 300;line(displayMat, pt1, pt2, CV_RGB(0, 255, 0), 10, 8, 0);//目標圖像 起點 終點// 線條粗細, 領接關系和偏移,一般設置默認值,8和0//畫矩形框Rect rect; rect.x = 20;rect.y = 20;rect.width = 20;rect.height = 20;rectangle(displayMat, rect, CV_RGB(0, 255, 0), 1, 8, 0);//的目標圖像 目標矩形 // 線條粗細,取-1為繪制實心矩形 領接關系和偏移,一般設置默認值,8和0imshow("圖片", displayMat);waitKey(0);return 0;}運行效果
4、構建一個直方圖
///*--------------------------【練習4】繪制一維灰度直方圖-------------------------------------*/ Mat My_Rraw_histogram(Mat* srcImage) //輸入:要處理的灰度圖 輸出:該圖像的直方圖 {//【2】定義變量MatND dstHist;int dims = 1; //需要計算的直方圖的維數float grayranges[] = { 0,255 };const float* ranges[] = { grayranges }; //這里需要為const類型int size = 256; //表示的是將統計的灰度值分成的等份int channels = 0; //灰度圖只有一個0通道//【3】計算圖像直方圖calcHist(srcImage, //輸入數組1, //數組個數&channels, //通道索引Mat(),//不使用掩膜dstHist, //輸出的目標直方圖dims, //需要計算的直方圖的維數&size, //存放每個維度的直方圖尺寸的數組ranges); //每一維數值的取值范圍 int scale = 1; //scale 每一個像素占的格數Mat dstImage(size * scale, size, CV_8U, Scalar(0)); //長 :size*scale ,寬:size ,值為0//【4】獲取最大值和最小值double minVal = 0;double maxVal = 0;minMaxLoc(dstHist, &minVal, &maxVal, 0, 0); //獲得直方圖中最大值和最小值//【5】繪制出直方圖int hpt = saturate_cast<int>(0.9 * size); //saturate_cast 是溢出保護 大概意思 :if(data<0) data = 0; else if (data > 255) data = 255;for (int i = 0;i < 256;i++){float binVal = dstHist.at<float>(i);int realVal = saturate_cast<int>(binVal * hpt / maxVal); //在圖像上的高度 = 像素值/最大像素值 * 0.9*256 這里0.9是為了削減圖像像素高度,因為最大的時候會觸及頂端不美觀rectangle(dstImage, Point(i * scale, size - 1), Point((i + 1) * scale - 1, size - realVal), Scalar(255));//要進行繪制的目標圖像 矩形的左下頂點 矩陣對角線上的右上頂點 線條的顏色(RGB)或亮度(灰度圖) 一共要繪制256個矩形}return dstImage; } //主函數 int main() {//【1】載入原圖Mat srcImage = imread("D:\\opencv_picture_test\\新垣結衣\\test2.jpg", 0); //原圖的灰度圖namedWindow("灰度圖", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮窗口imshow("灰度圖", srcImage);if (srcImage.empty()){printf("Could not find the image!\n");return -1;}Mat dstImage = My_Rraw_histogram(&srcImage);namedWindow("一維直方圖", WINDOW_NORMAL);//WINDOW_NORMAL允許用戶自由伸縮窗口imshow("一維直方圖", dstImage);waitKey(0);return 0; }運行結果:
嘿嘿,水了一篇文章。
總結
以上是生活随笔為你收集整理的数字图像处理小练习存档1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “毫墨时洒落”上一句是什么
- 下一篇: 口罩多少钱啊?