1. 程式人生 > >opencvC++學習4畫素操作

opencvC++學習4畫素操作

讀讀一個GRAY畫素點的畫素值(CV_8UC1)

Scalar intensity = img.at<uchar>(y, x); 
或者 Scalar intensity = img.at<uchar>(Point(x, y));

讀一個RGB畫素點的畫素值
Vec3f intensity = img.at<Vec3f>(y, x); 
float blue = intensity.val[0]; 
float green = intensity.val[1]; 
float red = intensity.val[2];寫畫素

修改畫素值

灰度影象
img.at<uchar

>(y,x) = 128;
RGB三通道影象
img.at<Vec3b>(y,x)[0]=128;// blue
img.at<Vec3b>(y,x)[1]=128;// green
img.at<Vec3b>(y,x)[2]=128;// red
空白影象賦值
img = Scalar(0);
ROI選擇
Rect r(10, 10, 100, 100);
Mat smallImg = img(r);

Vec3b與Vec3F

Vec3b對應三通道的順序是blue、green、red的uchar型別資料。
Vec3f對應三通道的float型別資料
把CV_8UC1轉換到CV32F1實現如下:
src.convertTo(dst, CV_32F);

實現畫素取反的效果

程式碼:

#include <opencv2\opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat src;
	src = imread("D:/opencvSRC/test.jpg");
	if (src.empty()) {

		printf("load image error!\n");
	}
	namedWindow("src", CV_WINDOW_AUTOSIZE);
	imshow("src", src);

	//單通道
	Mat dst1;
	cvtColor(src, dst1, CV_BGR2GRAY);
	int height = src.rows;
	int width = src.cols;
	int channels = src.channels();

	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			if (channels == 1) {

				int gray = dst1.at<uchar>(row, col);
				dst1.at<uchar>(row, col) = 255 - gray;
			}
		}
	}
	namedWindow("output1", CV_WINDOW_AUTOSIZE);
	imshow("output1", dst1);

	//三通道
	Mat dst;
	dst.create(src.size(), src.type());
	printf("height=%d width=%d channels=%d", height, width, channels);
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			if (channels == 3) {
				int b = src.at<Vec3b>(row, col)[0];
				int g = src.at<Vec3b>(row, col)[1];
				int r = src.at<Vec3b>(row, col)[2];

				dst.at<Vec3b>(row, col)[0] = 255 - b;
				dst.at<Vec3b>(row, col)[1] = 255 - g;
				dst.at<Vec3b>(row, col)[2] = 255 - r;
			}
		}
	}
	namedWindow("output", CV_WINDOW_AUTOSIZE);
	imshow("output", dst);

	//一個函式解決
	Mat dst2;
	dst2.create(src.size(), src.type());

	bitwise_not(src, dst2);
	namedWindow("output2", CV_WINDOW_AUTOSIZE);
	imshow("output2", dst2);

	waitKey(0);
	return 0;
}

效果圖:


相關推薦

opencvC++學習4操作

讀讀一個GRAY畫素點的畫素值(CV_8UC1)Scalar intensity = img.at<uchar>(y, x); 或者 Scalar intensity = img.at<

opencvC++學習22重對映(cv::remap)

什麼是畫素重對映簡單點說就是把輸入影象中各個畫素按照一定的規則對映到另外一張影象的對應位置上去,形成一張新的影象。API:Remap(InputArray src,// 輸入影象OutputArray dst,// 輸出影象InputArray  map1,// x 對映表

opencv3.4+python3.6 中文教程6之操作

目標 畫素顏色值的獲取及變更 影象特徵 RIO興趣區域 分割與融合 畫素獲取及變更 import numpy as np import cv2 as cv img = cv.imread(‘s

OpenCV二值化影象操作

二值化影象畫素不是0就是255,資料型別為uchar。所以訪問方法是: // 這裡inputmat是二值化影象的mat inputmat.at<uchar>(y, x); 判斷是否為白色的方法: if (inputmat.at<uchar&g

常用的操作演算法:影象加法、混合、提取影象中的ROI

影象可以是看成是一個多維的陣列。讀取一張圖片,可以看成是讀入了一系列的畫素內容。這些畫素內容,按

opencv 影象讀取顯示和操作

從今天起,開始從頭系統學習下opencv,下面記錄下影象的基本操作: 1. 影象的讀取和顯示 Mat image = imread(imagePath, 1); 第二個引數表示圖片讀入的方式(

OpenCV影象操作及效率分析

        學習OpenCV也幾個月了,雖然對OpenCV有些瞭解,但是感覺基礎還是沒打實,在這在介紹一下OpenCV的畫素操作,以及OpenCV讀取影象的格式和讀取影象的效率分析。當然文章也有很多沒有介紹到的地方,希望大家多多指教,相互交流。         在計

對影象的單個操作

       for(int x=0;x<gray.rows;x++)//gray為二值圖  {  for(int y=0;y<gray.cols;y++)  {  if(gray.at<uchar>(x,y)==0)  {   img1.at<Vec3b>(x,y)=bc

opencv影象操作方法

影象容器Mat Mat和Matlab裡的陣列格式有點像,但一般是二維向量,如果是灰度圖,一般存放<uchar>型別;如果是RGB彩色圖,存放<Vec3b>型別。 單通道灰度圖資料存放格式: 多通道的影象中,每列並列存放通道數量的子列,如RGB三通

opencv操作

1–bit_depth—位元數—代表8bite,16bites,32bites,64bites—舉個例子吧–比如說,如 如果你現在建立了一個儲存–灰度圖片的Mat物件,這個影象的大小為寬100,高100,那麼,現在這張 灰度圖

操作

3.2 解決OpenGL常用的RGB畫素資料與BMP檔案的BGR畫素資料順序不一致問題 可以使用一些程式碼交換每個畫素的第一位元組和第三位元組,使得RGB的資料變成BGR的資料。當然也可以使用另外的方式解決問題:新版本的OpenGL除了可以使用GL_RGB讀取畫素的紅、綠、藍資料外,也可以使用GL_BGR按照

Android遊戲Graphics繪圖之影象操作

  我們在玩遊戲時經常會看到一些影象的特效,比如半透明等效果。要實現這些效果並不難,只需要對影象本身的畫素執行操作。Android中的 Bitmap同樣提供了操作畫素的方法,可以通過getPixels方法來獲得該影象的畫素並放到一個數組中,我們處理這個畫素陣列就可以了,最後

c# opencvsharp學習筆記(4操作點,椒鹽噪聲,重對映

1.操作畫素點在這裡和c++的區別就出來了,c++對畫素點的setget用的是at函式。而c#的at函式只能用於get,set用的就是set函式,我一般直接用setget函式. // // 摘要: // Set a value to t

OpenCV學習心得二:影象基本操作(建立,讀取,載入,儲存,展示)+操控

課程緊張,以後儘量每節課消化後及時更新部落格以加深印象。 此次為第一節實驗課內容,為了方便,我將各個功能寫成一個小方法,在main函式裡呼叫已檢驗成功與否。 helloline()  :建立圖片 draw()  :基本作圖 pixels():操縱圖片畫素點 thr(

OpenCV 2.4.9 學習筆記(4)—— 型別與Templates的限制使用

限制使用templates   C++中的Templates使得介面機制非常好用,高效而且能夠保證資料與演算法的安全。但是過多地使用templates可能會增加計算時間和程式碼長度,有時候還能難區分介面和實現。在OpenCV中過多使用templates並不是一件好事,OpenCV的refman中提到Open

我的OpenCV學習筆記(二):操作每個

首先推薦一本書:《OpenCV 2 Computer Vision Application Programming Cookbook》網上可以下載到這本書的英文版,貌似沒有翻譯的。這本書的特點是裡面的程式不是那種為了演示函式功能而寫的面向過程的小程式,而是用面向物件的思路寫

【深度學習】Ubuntu16.04+tensorflow+opencv+pygame 執行FlappyBird(小鳥)程式碼(4

一,安裝 Anaconda+tensorflow 我的系統環境: Ubuntu16.04, Anaconda(python 3.6) opencv3.1 二,下載程式碼+安裝opencv

opencv學習使用直方圖統計

1.影象由畫素組成,在一個單通道的灰度影象中,每個畫素的值介於0(黑色)~255(白色)之間。 2.在opencv中計算直方圖可以通過使用calcHist函式。 3.class:類 4.MatND指多維陣列 #include <opencv2/ope

opencv學習筆記存取

我不想永遠是小明,我也想成為小紅。 椒鹽噪點:隨機的將部分畫素設定為白色或黑色。如果部分畫素丟失,那麼這種噪點就會出現。 cout是輸出,屬於iostream,格式:cout<< CV_[位數][帶符號與否][型別字首]C[通道數],如CV

Qimage操作

這篇文章主要闡述瞭如何使用Qt在畫素級別上對影象進行操作,並實現了一些影象效果,這些效果主要有:灰度,模糊,銳化,新增相框,金屬質感,改變影象飽和度,亮度還有白平衡。 scanLine 返回某一行資料,轉換為QRgb指標可進行直接有效的畫素存取操作。 介紹 文章中,我們將討論在Qt中修改