opencv學習系列——圖像基本操作

圖像的加載顯示

利用圖像庫的功能,實現從文件加載圖像,並在窗口中進行顯示的功能;利用常見的圖像文件格式(.jpg; .png; .bmp; .gif等)進行測試;
這個很簡單,大家一看程序就懂了

#include<opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("D:/picture/a.png");
	Mat dst;
	//cvtColor(src, dst, COLOR_RGB2GRAY, 1);//去色
	namedWindow("src", WINDOW_NORMAL);
	imshow("src",src);
	waitKey();//保持輸出圖像不消失
	return 0;
}

這段代碼是最基本的,要記住加載圖像代碼
Mat src = imread(Path);
和顯示代碼
namedWindow(“src”, WINDOW_NORMAL);
imshow(“src”,src);
waitKey();這一行必須有,起作用是保持圖像顯示在屏幕上,否則會出現閃退。
Mat是最基本的定義符合,它定義一個像素矩陣,讀取圖像後圖像的每一個像素信息就會存到這個矩陣裏面。
注:gif格式不能這樣讀取

圖像合成

現有一張4通道透明圖像a.png: 從其中提取出alpha通道並顯示; 用alpha混合,爲a.png替換一張新的背景(背景圖自選)
在這裏插入圖片描述
a) 從其中提取出alpha通道並顯示;
原理:創建一個8位無符號的單通道照片用來存儲alpha通道,將原來的照片每個像素點的值對應到新的照片矩陣中即可。
Alpha
在圖像處理中,Alpha用來衡量一個像素或圖像的透明度。在非壓縮的32位RGB圖像中,每個像素是由四個部分組成:一個Alpha通道和三個顏色分量(R、G和B)。當Alpha值爲0時,該像素是完全透明的,而當Alpha值爲255時,則該像素是完全不透明。
Alpha混色是將源像素和背景像素的顏色進行混合,最終顯示的顏色取決於其RGB顏色分量和Alpha值。它們之間的關係可用下列公式來表示:
顯示顏色 = 源像素顏色 X alpha / 255 + 背景顏色 X (255 - alpha) / 255
創建圖像矩陣的格式
CV_<bit_depth>(S|U|F)C<number_of_channels>
(1)–bit_depth—比特數—代表8bite,16bites,32bites,64bites,如
如果你現在創建了一個存儲–灰度圖片的Mat對象,這個圖像的大小爲寬100,高100,那麼,現在這張灰度圖片中有10000個像素點,它每一個像素點在內存空間所佔的空間大小是8bite,8位–所以它對應的就是CV_8。
(2)–S|U|F–S--代表—signed int—有符號整形
U–代表–unsigned int–無符號整形
F–代表–float---------單精度浮點型
(3)–C<number_of_channels>----代表—一張圖片的通道數,比如:
1–灰度圖片–grayImg—是–單通道圖像
2–RGB彩色圖像---------是–3通道圖像

typedef Vec <uchar, 2> Vec2b;

Vec2b—表示每個Vec2b對象中,可以存儲2個char(字符型)數據
Vec3b—表示每一個Vec3b對象中,可以存儲3個char(字符型)數據,比如可以用這樣的對象,去存儲RGB圖像中的
Vec4b—表示每一個Vec4b對象中,可以存儲4個字符型數據,可以用這樣的類對象去存儲—4通道RGB+Alpha的圖。

核心代碼:
mat.at(i, j) = img.at(i, j)[3];

bl80Mzk0Mzk3Nw==,size_16,color_FFFFFF,t_70)`#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;


int main()
{
	Mat img = imread("D:/picture/a.png", -1);//-1使能讀取第4個RGBA中的A通道,即爲alpha通道
	Mat mat(img.rows, img.cols, CV_8UC1);//可以創建----8位無符號的單通道---灰度圖片------grayImg
	for (int i = 0; i < img.rows; ++i)
	{
		for (int j = 0; j < img.cols; ++j)
		{
			mat.at<uchar>(i, j) = img.at<Vec4b>(i, j)[3];//提取第四通道
		}
	}
	namedWindow("alpha通道圖像");
	imshow("alpha通道圖像", mat);
	waitKey();
	return 0;
}`

在這裏插入圖片描述
b) 用alpha混合,爲a.png替換一張新的背景(背景圖自選);
在這裏插入圖片描述
原理:對圖像的alpha通道進行處理,如果值爲0,說明色素透明,此處填充背景顏色;否則填充圖像顏色,所以對創建新的像素矩陣,對每一個像素點進行按比例分配前景圖和背景圖的像素點即可。
核心代碼:
double temp = img.at(i, j)[3] / 255.00;
mat.at(i, j) = (1 - temp) * backimg.at(i, j) + temp * img.at(i, j);

#include<iostream>  
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;
int main()
{
	Mat img = imread("D:/picture/aa.png",-1);
	Mat backimg = imread("D:/picture/ee.png",-1);
	Mat mat(img.rows, img.cols, CV_8UC4);//創建8爲4通道照片
	for (int i = 0; i < img.rows; ++i)
	{
		for (int j = 0; j < img.cols; ++j)
		{
			double temp = img.at<Vec4b>(i, j)[3] / 255.00;
			mat.at<Vec4b>(i, j)[0] = (1 - temp) * backimg.at<Vec4b>(i, j)[0] + temp * img.at<Vec4b>(i, j)[0];
			mat.at<Vec4b>(i, j)[1] = (1 - temp) * backimg.at<Vec4b>(i, j)[1] + temp * img.at<Vec4b>(i, j)[1];
			mat.at<Vec4b>(i, j)[2] = (1 - temp) * backimg.at<Vec4b>(i, j)[2] + temp * img.at<Vec4b>(i, j)[2];
			mat.at<Vec4b>(i, j)[3] = (1 - temp) * backimg.at<Vec4b>(i, j)[3] + temp * img.at<Vec4b>(i, j)[3];
		}
	}
	namedWindow("alpha合成");
	imshow("alpha合成", mat);
	waitKey();
	return 0;
}

測試截圖:
在這裏插入圖片描述
注意問題:

  1. 格式問題:前景圖是給定好的,特別要注意背景圖的選取,最簡單的是ppt直接製作純色的背景,這種最爲簡單;如果想用別的風景之類照,則照片格式的4個通道一定需要都有而且明確,否則會出現內存錯誤的信息。有的照片不能呈現建議使用Photoshop處理一下即可。
  2. 大小問題,從算法上來看,新建的圖片參照前景圖大小,這就要求背景圖至少比前景圖大,才能保證每個像素點就是對應的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章