openCV简单的图片处理(雪花,减少颜色)

合集下载

OpenCV图像处理技术介绍

OpenCV图像处理技术介绍

OpenCV图像处理技术介绍一、概述OpenCV(Open Source Computer Vision Library)是一款用于计算机视觉和机器视觉的开源跨平台库。

它被广泛应用于计算机视觉、图像处理、机器学习、人工智能等领域,是一种非常强大、开放的框架。

本文将重点介绍 OpenCV 图像处理技术,以帮助读者了解它的具体应用和实现过程。

二、图像的读取和展示要使用 OpenCV 进行图像处理,需要先加载图像。

OpenCV 支持多种图像格式,如 BMP、JPEG、PNG、GIF 等。

用OpenCV 加载图像的方法有两种:一种是cv::imread() 函数,另一种是 cv::VideoCapture 类。

cv::imread() 函数可以通过指定图像路径或网络 URL 加载本地或远程图像,读取后返回一个 cv::Mat 对象,然后可以使用cv::imshow() 函数将图像展示在屏幕上。

三、灰度化和二值化灰度化将一个彩色图像转换为黑白图像,使得图像的像素值只有一个亮度值,而没有颜色信息。

在 OpenCV 中,可以通过cv::cvtColor() 函数将一张彩色图像转换为灰度图像。

二值化是将灰度图像中的像素值转换为 0 或 255,即黑色或白色。

它主要用于将图像转换为二进制图像,方便进一步处理。

在OpenCV 中,可以使用 cv::threshold() 函数实现图像的二值化,可以设置操作的阈值、最大值和操作类型等参数。

四、图像滤波图像滤波是指对图像进行平滑或增强的处理方法。

在 OpenCV 中,可以使用 cv::GaussianBlur() 函数实现图像的高斯滤波,可以设置卷积核的大小和标准差等参数,以及边缘处理的方法。

此外,还可以使用 cv::medianBlur() 函数进行中值滤波,cv::bilateralFilter() 函数进行双边滤波,以及 cv::blur() 函数进行均值滤波等。

openCV简单的图片处理(雪花,减少颜色)

openCV简单的图片处理(雪花,减少颜色)

openCV学习笔记(2)__openCV简单的图片处理(雪花,减少颜色)openCV简单的图片处理(雪花,减少颜色)2012年10月12日22:32继而,搭建好平台之后,就可以用openCV进行简单的图片处理.这里的笔记,是在这本书(OpenC V_2_Computer_Vision_Application_Programming_Cookbook)的基础上学习的.好,言归正传.第一个函数,在上一个的main函数里面进行实现.雪花:(尊重原文,这里用的是原文的salt函数,撒盐``)首先,是原图的显示:屏幕剪辑的捕获时间: 2012/11/4 22:33这次放在E盘,就不用用管理员权限来操作了.继续而这次的函数salt,作用是在图上按照自己需要的点数来添加白点.源码://被注释掉的东西表示用来玩的说``屏幕剪辑的捕获时间: 2012/11/4 22:55大概应该可以看得出,rand()%image.cols 和rand()%image.rows表示的就是图的colum n(纵列)和row(横列),对随机出来的像素进行修改.对于if else 部分:图像的组成,用灰度来表示.比如黑白的图像,用灰度图就可以表示出来.如果面对的是彩图,一般按照三基色(红绿蓝)每个像素由3个基本颜色的不同灰度表示,也就是说,如果image 的chan nel为3的时候,需要修改三个channel的参数,而如果单单是黑白,channel只有1,那么只要修改一个参数就可以.可知,255是一个尽头``` 白色``函数的主体如下:屏幕剪辑的捕获时间: 2012/11/4 22:56//注释的colorReduce是下一个函数运行结果``如下``:屏幕剪辑的捕获时间: 2012/11/4 22:58加上10000捏``?屏幕剪辑的捕获时间: 2012/11/4 22:59屏幕剪辑的捕获时间: 2012/11/4 23:02如果参数改成0?屏幕剪辑的捕获时间: 2012/11/4 23:04结果如下:屏幕剪辑的捕获时间: 2012/11/4 23:05撒胡椒的说`` 黑色是白色的另外一端``每一个像素是又一个8-bit的unsigned char型储存,因而色的数目就有256x256x256个.数目之大,因而,下面的函数是用来减少颜色的种类的.函数主体:屏幕剪辑的捕获时间: 2012/11/4 23:14当中的div可以理解为每个灰度级划分的多少.屏幕剪辑的捕获时间: 2012/11/4 23:19这个函数体是主要的处理,例如是256色,这个表达就会把[0,div)区间的色素变成div/2的,[di v,2*div)的就会变成3*div/2,把周围附近的色调简化为一个色调.这样对颜色进行了简化.运行结果如下:屏幕剪辑的捕获时间: 2012/11/4 23:22效果不太明显.把div换成是64的话:屏幕剪辑的捕获时间: 2012/11/4 23:23继续加强的话:屏幕剪辑的捕获时间: 2012/11/4 23:24屏幕剪辑的捕获时间: 2012/11/4 23:24随着分化,颜色表示的单调性会让颜色越来越枯燥.函数的主体,把salt注释掉,把colorReduce加上就好.记得要在主体前面加上声明,屏幕剪辑的捕获时间: 2012/11/4 23:26ps:对于colorReduce的函数,主体还有几个方法: data[i]= data[i] –data[i]%div + div/2;和上述的方法一样,不过这个是先退回到原点在加上div/2另外一个,是使用位运算:uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0 data[i]= (data[i]&mask) + div/2;。

使用OpenCV进行图像处理的基本方法与技巧

使用OpenCV进行图像处理的基本方法与技巧

使用OpenCV进行图像处理的基本方法与技巧图像处理是计算机视觉领域的一个重要分支,而OpenCV作为一个开源的计算机视觉库,提供了丰富的图像处理函数和算法,使得图像处理变得更加简单和高效。

本文将介绍使用OpenCV进行图像处理的基本方法与技巧。

一、图像的读取与显示在使用OpenCV进行图像处理之前,首先需要将图像读入内存,并进行显示。

OpenCV提供了imread()函数用于读取图像,imshow()函数用于显示图像。

示例如下:```pythonimport cv2# 读取图像img = cv2.imread('image.jpg')# 显示图像cv2.imshow('image', img)cv2.waitKey(0)cv2.destroyAllWindows()```二、图像的灰度化与二值化在进行图像处理时,常常需要将图像转换为灰度图或二值图,以便于后续的处理。

OpenCV提供了cvtColor()函数用于图像的颜色空间转换,threshold()函数用于图像的二值化。

示例如下:```pythonimport cv2# 读取彩色图像img = cv2.imread('image.jpg')# 灰度化gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 显示灰度图和二值图cv2.imshow('gray', gray)cv2.imshow('binary', binary)cv2.waitKey(0)cv2.destroyAllWindows()```三、图像的平滑与滤波图像平滑与滤波是图像处理中常用的操作,可以用于去除图像中的噪声,平滑图像的边缘等。

opencv基本操作

opencv基本操作

opencv基本操作OpenCV(OpenSourceComputerVisionLibrary)是一个开源计算机视觉库,是计算机视觉领域中最常用的库之一。

它由C++编写,支持Python、Java等多种编程语言。

OpenCV提供了各种各样的算法和函数,可用于图像处理、计算机视觉和机器学习等领域。

本文将介绍OpenCV的基本操作,包括图像的读取、显示、保存、颜色空间转换、图像缩放、图像平移、图像旋转、图像翻转、图像阈值化、图像平滑、边缘检测等。

1. 图像的读取、显示、保存OpenCV可以读取多种格式的图像文件,包括BMP、JPEG、PNG、TIFF等。

读取图像的函数是cv::imread(),语法如下:cv::Mat cv::imread(const string& filename, int flags = cv::IMREAD_COLOR);其中,filename是要读取的图像文件名,flags是读取图像的方式,可以是cv::IMREAD_COLOR(默认)、cv::IMREAD_GRAYSCALE(灰度图像)、cv::IMREAD_UNCHANGED(包括alpha通道的图像)等。

读取图像后,可以使用cv::imshow()函数将图像显示出来,语法如下: void cv::imshow(const string& winname, InputArray mat);其中,winname是窗口的名称,mat是要显示的图像。

最后,使用cv::imwrite()函数将图像保存到文件中,语法如下:bool cv::imwrite(const string& filename, InputArray img, const vector<int>& params = vector<int>());其中,filename是要保存的图像文件名,img是要保存的图像,params是保存图像的参数,比如JPEG的压缩质量等。

pythonopencv图像处理基本操作示例详解

pythonopencv图像处理基本操作示例详解

pythonopencv图像处理基本操作⽰例详解⽬录1.图像基本操作①读取图像②显⽰图像③视频读取④图像截取⑤颜⾊通道提取及还原⑥边界填充⑦数值计算⑧图像融合2.阈值与平滑处理①设定阈值并对图像处理②图像平滑-均值滤波③图像平滑-⽅框滤波④图像平滑-⾼斯滤波⑤图像平滑-中值滤波3.图像的形态学处理①腐蚀操作②膨胀操作③开运算和闭运算4.图像梯度处理①梯度运算②礼帽与⿊帽③图像的梯度处理5.边缘检测①Canny边缘检测1.图像基本操作①读取图像②显⽰图像该函数中,name是显⽰窗⼝的名字,可输⼊任意字符串,img就是读取的图⽚矩阵。

waitKey()意思是图⽚停留的时间,若设为0,则会⼀直保留直到关闭图⽚。

③视频读取使⽤VideoCapture⽅法读取视频,若可以成功读取,则vc.read()返回的第⼀个参数就是True,否则为False。

返回的第⼆个参数frame就是读取的视频图⽚。

此时只能读取⼀张。

该函数可以将读取的图⽚按照设定的速度依次展⽰,cv.waitKey中的数值越⼩,展⽰的速度越快。

gray处只是把图⽚设置成了灰度图像,直接⽤frame展⽰也可以,就是原图。

最后的0xFF==27就是ESC键,按下这个键就会退出。

④图像截取因为图像读取的是矩阵,因此使⽤矩阵的截取⽅法即可。

⑤颜⾊通道提取及还原CV读取图像的时候,彩⾊是BGR⽽⾮RBG,使⽤split以及merge⽅法进⾏提取和还原。

通过将其他通道设置为0,即可展⽰只保留某⼀颜⾊通道的图像。

⑥边界填充指定⼤⼩后,有不同的填充⽅法,通过borderType来进⾏设置。

⑦数值计算若通过矩阵计算⽅式直接相加,则当结果超过255的时候,会进⾏取余操作。

若通过cv.add⽅法,则超过255的会全部截断为255图像尺⼨的修改:cv.resize(图像矩阵,尺⼨长宽元组)⑧图像融合通过cv.addWeighted对图像进⾏融合,参数分别为:第⼀张图,权值,第⼆张图,权值,微调的度。

OpenCV 3.1.0 图像处理教程-04图像操作

OpenCV 3.1.0 图像处理教程-04图像操作
namedWindow("My Image", CV_WINDOW_AUTOSIZE); imshow("My Image", image); waitKey(0); return 0;
}
Thank You !
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, 32F);
for (int col = 0; col < width; col++) { if (channels == 3) { image.at<Vec3b>(row, col)[0] = 0; // blue image.at<Vec3b>(row, col)[1] = 0; // green }
} }
OpenCV 3.1.0 – 图像处理教程
图像操作
读写图像 读写像素 修改像素值
读写图像
imread 可以指定加载为灰度或者RGB图像 Imwrite 保存图像文件,类型由扩展名决定
读写像素
读一个GRAY像素点的像素值(CV_8UC1) Scalar intensity = img.at<uchar>(y, x); 或者 Scalar intensity = img.at<uchar>(Point(x, y));
灰度图像 img.at<uchar>(y, x) = 128;

opencv处理图像的流程

opencv处理图像的流程英文回答:OpenCV is a powerful open-source library for computer vision and image processing. It provides various functions and algorithms to manipulate and analyze images. The general workflow of image processing using OpenCV can be summarized in several steps.Firstly, we need to load the image into our program. This can be done using the `imread` function in OpenCV. For example, if we have an image file called "image.jpg", we can load it using the following code:import cv2。

image = cv2.imread("image.jpg")。

Once the image is loaded, we can perform various operations on it. One common operation is to convert theimage to grayscale. This can be done using the `cvtColor` function. For example, to convert the image to grayscale,we can use the following code:gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)。

opencv图像处理常用操作一

opencv图像处理常⽤操作⼀读取显⽰图像# 读取并显⽰图像import cv2path_to_image = r'pby.jpg'"""第⼆个参数1 读取彩⾊,默认0 读取灰度图-1 加载图像,包括alpha通道"""original_image = cv2.imread(path_to_image, 1)cv2.imshow('original image', original_image)cv2.waitKey(0)cv2.destroyAllWindows()dWindow('image', cv2.WINDOW_NORMAL)cv2.imshow('image', original_image)cv2.waitKey(0)cv2.destroyAllWindows()# 保存图像import cv2img = cv2.imread('pby.jpg', 0)cv2.imshow('image', img)k = cv2.waitKey(0)if k == 27: # 等待ESC退出cv2.destroyAllWindows()elif k == ord('s'): # 等待关键字,保存和退出cv2.imwrite('gray.png', img)cv2.destroyAllWindows()使⽤本⽂章不深⼊讲解matplotlib的使⽤,后续更新matplotlib的详细使⽤教程"""OpenCV加载的彩⾊图像处于BGR模式。

但是Matplotlib以RGB模式显⽰。

"""import cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('pby.jpg', 0)plt.imshow(img, cmap='gray', interpolation='bicubic')plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值plt.show()访问摄像头import cv2 as cvcap = cv.VideoCapture(0) # 参数可以是0-3,0表⽰默认摄像头print("width is %s" % cap.get(cv.CAP_PROP_FRAME_WIDTH))print("height is %s" % cap.get(cv.CAP_PROP_FRAME_HEIGHT))if cap.set(cv.CAP_PROP_FRAME_WIDTH, 320):print('width now sets to 320')if cap.set(cv.CAP_PROP_FRAME_HEIGHT, 240):print('height now sets to 240')if not cap.isOpened():print("Cannot open camera")exit()while True:# 逐帧捕获ret, frame = cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")breakgray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显⽰结果帧cv.imshow('frame', gray)if cv.waitKey(1) == ord('q'):break# 完成所有操作后,释放捕获器cap.release()cv.destroyAllWindows()读取视频⽂件import cv2 as cvcap = cv.VideoCapture('output.avi') # 传⼊视频路径while cap.isOpened():ret, frame = cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")breakgray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)cv.imshow('frame', gray)if cv.waitKey(25) == ord('q'):breakcap.release()cv.destroyAllWindows()写视频⽂件import cv2 as cvcap = cv.VideoCapture(0)# if cap.set(cv.CAP_PROP_FRAME_WIDTH, 320):# print('width now sets to 320')# if cap.set(cv.CAP_PROP_FRAME_HEIGHT, 240):# print('height now sets to 240')fourcc = cv.VideoWriter_fourcc(*'XVID') # 定义编解码器并创建VideoWriter对象out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))while cap.isOpened():ret, frame = cap.read()if not ret:print("Can't receive frame (stream end?). Exiting ...")break# gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)out.write(frame)cv.imshow('frame', frame)if cv.waitKey(1) == ord('q'):break# 完成⼯作后释放所有内容cap.release()out.release()cv.destroyAllWindows()在图像上画形状、⽂字import cv2 as cvimport numpy as np# 创建⿊⾊的图像img = np.zeros((512, 512, 3), np.uint8)# 绘制⼀条厚度为5的蓝⾊对⾓线cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)# 画矩形cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)# 画圆圈cv.circle(img, (447, 63), 63, (0, 0, 255), -1)# 画椭圆cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)# 画多边形pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)pts = pts.reshape((-1, 1, 2))pts2 = np.array([[255, 240], [198, 189], [99, 345]], np.int32)pts2 = pts2.reshape(-1, 1, 2)cv.polylines(img, [pts], True, (0, 255, 255)) # 闭合多边形cv.polylines(img, [pts2], False, (0, 255, 255)) # 只连接不闭合# 向图⽚中添加⽂本font = cv.FONT_HERSHEY_SIMPLEXcv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA) cv.imshow('img', img)cv.waitKey(0)cv.destroyAllWindows()import cv2 as cvimport numpy as npimport randomdef main():# ⿏标回调函数def draw_circle(event, x, y, flags, param):if event == cv.EVENT_LBUTTONDBLCLK:cv.circle(img, (x, y), random.randint(50, 200), (255, 0, 0), -1)# 创建⼀个⿊⾊的图像,⼀个窗⼝,并绑定到窗⼝的功能img = np.zeros((512, 512, 3), np.uint8)dWindow('image')cv.setMouseCallback('image', draw_circle)while True:cv.imshow('image', img)if cv.waitKey(20) & 0xFF == 27: # 按esc退出breakcv.destroyAllWindows()if __name__ == '__main__':main()轨迹栏的使⽤import cv2 as cvimport numpy as npdef nothing(x):pass# 创建⼀个⿊⾊的图像img = np.zeros((300, 512, 3), np.uint8)dWindow('image')# 创建颜⾊变化的轨迹栏cv.createTrackbar('R', 'image', 0, 255, nothing)cv.createTrackbar('G', 'image', 0, 255, nothing)cv.createTrackbar('B', 'image', 0, 255, nothing)# 为 ON/OFF 功能创建开关switch = 'OFF/ON'cv.createTrackbar(switch, 'image', 0, 1, nothing)while True:cv.imshow('image', img)k = cv.waitKey(1) & 0xFFif k == 27:break# 得到四条轨迹的当前位置r = cv.getTrackbarPos('R', 'image')g = cv.getTrackbarPos('G', 'image')b = cv.getTrackbarPos('B', 'image')s = cv.getTrackbarPos(switch, 'image')if s == 0:img[:] = 0else:img[:] = [b, g, r]cv.destroyAllWindows()访问像素点# 访问像素点def access_px():img = cv.imread('pby.jpg') # 加载彩⾊图像,默认是彩⾊图像px = img[100, 100] # 通过⾏和列坐标来访问像素值print(px) # [37 61 73]# 仅访问蓝⾊像素blue = img[100, 100, 0] # opencv读取图⽚是BGR格式print(blue) # 37img[100, 100] = [255, 255, 255] # 修改该坐标对应的像素值print(img[100, 100]) # [255 255 255]# 上⾯的⽅法通常⽤于选择数组的区域,例如前5⾏和后3列。

OpenCV案例(五):更换背景色

OpenCV案例(五):更换背景⾊1、证件背景替换代码实现思路:1.将⼆维图像数据线性化2.使⽤K-means聚类;分离出背景⾊3.背景与⼈物像素⼆值化4.腐蚀 + ⾼斯模糊:图像与背景交汇处⾼斯模糊化5.更换背景⾊以及交汇处融合处理代码:1. #include <opencv2/opencv.hpp>2. #include <iostream>3.4. using namespace std;5. using namespace cv;6.7. int main(int argc, char** argv) {8. Mat src = imread("../img/toux.jpg");9. if (src.empty()) {10. printf("could not load image...\n");11. return -1;12. }13. imshow("原图", src);14.15. // 1.将⼆维图像数据线性化16. Mat data;17. for (int i = 0; i < src.rows; i++) //像素点线性排列18. for (int j = 0; j < src.cols; j++)19. {20. Vec3b point = src.at<Vec3b>(i, j);21. Mat tmp = (Mat_<float>(1, 3) << point[0], point[1], point[2]);22. data.push_back(tmp);23. }24.25. // 2.使⽤K-means聚类;分离出背景⾊26. int numCluster = 4;27. Mat labels;28. TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 0.1);29. kmeans(data, numCluster, labels, criteria, 3, KMEANS_PP_CENTERS);30.31. // 3.背景与⼈物⼆值化32. Mat mask = Mat::zeros(src.size(), CV_8UC1);33. int index = src.rows * 2 + 2; //获取点(2,2)作为背景⾊34. int cindex = labels.at<int>(index);35. /* 提取背景特征 */36. for (int row = 0; row < src.rows; row++) {37. for (int col = 0; col < src.cols; col++) {38. index = row * src.cols + col;39. int label = labels.at<int>(index);40. if (label == cindex) { // 背景41. mask.at<uchar>(row, col) = 0;42. }43. else {44. mask.at<uchar>(row, col) = 255;45. }46. }47. }48. //imshow("mask", mask);49.50. // 4.腐蚀 + ⾼斯模糊:图像与背景交汇处⾼斯模糊化51. Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));52. erode(mask, mask, k);53. //imshow("erode-mask", mask);54. GaussianBlur(mask, mask, Size(3, 3), 0, 0);55. //imshow("Blur Mask", mask);56.57. // 5.更换背景⾊以及交汇处融合处理58. RNG rng(12345);59. Vec3b color; //设置的背景⾊60. color[0] = 217;//rng.uniform(0, 255);61. color[1] = 60;// rng.uniform(0, 255);62. color[2] = 160;// rng.uniform(0, 255);63. Mat result(src.size(), src.type());64.65. double w = 0.0; //融合权重66. int b = 0, g = 0, r = 0;67. int b1 = 0, g1 = 0, r1 = 0;68. int b2 = 0, g2 = 0, r2 = 0;69.70. for (int row = 0; row < src.rows; row++) {71. for (int col = 0; col < src.cols; col++) {72. int m = mask.at<uchar>(row, col);73. if (m == 255) {74. result.at<Vec3b>(row, col) = src.at<Vec3b>(row, col); // 前景75. }76. else if (m == 0) {77. result.at<Vec3b>(row, col) = color; // 背景78. }79. else {/* 融合处理部分 */80. w = m / 255.0;81. b1 = src.at<Vec3b>(row, col)[0];82. g1 = src.at<Vec3b>(row, col)[1];83. r1 = src.at<Vec3b>(row, col)[2];84.85. b2 = color[0];86. g2 = color[1];87. r2 = color[2];88.89. b = b1 * w + b2 * (1.0 - w);90. g = g1 * w + g2 * (1.0 - w);91. r = r1 * w + r2 * (1.0 - w);92.93. result.at<Vec3b>(row, col)[0] = b;94. result.at<Vec3b>(row, col)[1] = g;95. result.at<Vec3b>(row, col)[2] = r;96. }97. }98. }99. imshow("背景替换", result);100.101. waitKey(0);102. return 0;103. }结果:2、视频背景替换视频背景替换思路:Take each frame of the videoConvert from BGR to HSV color-spaceWe threshold the HSV image for a range of blue colorNow extract the blue object alone, we can do whatever on that image we want.视频帧背景替换关键API:1、 cvtColor(frame, hsv, COLOR_BGR2HSV); //转换颜⾊域2、 inRange(hsv, Scalar(35, 43, 46), Scalar(155, 255, 255), OutImg); //提取背景代码:1. #include <opencv2/opencv.hpp>2. #include <iostream>3.4. using namespace cv;5. using namespace std;6.7. Mat replace_and_blend(Mat &frame, Mat &mask);8. Mat background_01;9. Mat background_02;10. int main(int argc, char** argv) {11. // start here...12. background_01 = imread("D:/vcprojects/images/bg_01.jpg");13. background_02 = imread("D:/vcprojects/images/bg_02.jpg");14. VideoCapture capture;15. capture.open("D:/vcprojects/images/01.mp4");16. if (!capture.isOpened()) {17. printf("could not find the video file...\n");18. return -1;19. }20. char* title = "input video";21. char* resultWin = "result video";22. namedWindow(title, CV_WINDOW_AUTOSIZE);23. namedWindow(resultWin, CV_WINDOW_AUTOSIZE);24. Mat frame, hsv, mask;25. int count = 0;26. while (capture.read(frame)) {27. cvtColor(frame, hsv, COLOR_BGR2HSV);28. inRange(hsv, Scalar(35, 43, 46), Scalar(155, 255, 255), mask);29. // 形态学操作30. Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));31. morphologyEx(mask, mask, MORPH_CLOSE, k);32. erode(mask, mask, k);33. GaussianBlur(mask, mask, Size(3, 3), 0, 0);34.35. Mat result = replace_and_blend(frame, mask);36. char c = waitKey(1);37. if (c == 27) {38. break;39. }40. imshow(resultWin, result);41. imshow(title, frame);42. }43.44. waitKey(0);45. return 0;46. }47.48. Mat replace_and_blend(Mat &frame, Mat &mask) {49. Mat result = Mat::zeros(frame.size(), frame.type());50. int h = frame.rows;51. int w = frame.cols;52. int dims = frame.channels();53.54. // replace and blend55. int m = 0;56. double wt = 0;57.58. int r = 0, g = 0, b = 0;59. int r1 = 0, g1 = 0, b1 = 0;60. int r2 = 0, g2 = 0, b2 = 0;61.62. for (int row = 0; row < h; row++) {63. uchar* current = frame.ptr<uchar>(row);64. uchar* bgrow = background_02.ptr<uchar>(row);65. uchar* maskrow = mask.ptr<uchar>(row);66. uchar* targetrow = result.ptr<uchar>(row);67. for (int col = 0; col < w; col++) {68. m = *maskrow++;69. if (m == 255) { // 背景70. *targetrow++ = *bgrow++;71. *targetrow++ = *bgrow++;72. *targetrow++ = *bgrow++;73. current += 3;74.75. } else if(m==0) {// 前景76. *targetrow++ = *current++;77. *targetrow++ = *current++;78. *targetrow++ = *current++;79. bgrow += 3;80. } else {81. b1 = *bgrow++;82. g1 = *bgrow++;83. r1 = *bgrow++;84.85. b2 = *current++;86. g2 = *current++;87. r2 = *current++;88.89. // 权重90. wt = m / 255.0;91.92. // 混合93. b = b1*wt + b2*(1.0 - wt);94. g = g1*wt + g2*(1.0 - wt);95. r = r1*wt + r2*(1.0 - wt);96.97. *targetrow++ = b;98. *targetrow++ = g;99. *targetrow++ = r;100. }101. }102. }103.104. return result;105. }视频中绿布替换成风景背景:。

Python+OpenCV图像处理——色彩空间转换

Python+OpenCV图像处理——⾊彩空间转换⼀、⾊彩空间的转换代码如下:#⾊彩空间转换import cv2 as cvdef color_space_demo(img):gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #RGB转换为GRAY 这⾥的GRAY是单通道的cv.imshow("gray", gray)hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV) #RGB转换为HSVcv.imshow("hsv", hsv)yuv = cv.cvtColor(img, cv.COLOR_RGB2YUV) #RGB转换为YUVcv.imshow("yuv",yuv)Ycrcb = cv.cvtColor(img, cv.COLOR_RGB2YCrCb) #RGB转换为YCrCbcv.imshow("Ycrcb", Ycrcb)src = cv.imread('D:\imageload\example.png')dWindow('first_image', cv.WINDOW_AUTOSIZE)cv.imshow('first_image', src)color_space_demo(src)cv.waitKey(0)cv.destroyAllWindows()运⾏结果:1.RGB就是指Red,Green和Blue,⼀副图像由这三个channel(通道)构成2.Gray就是只有灰度值⼀个channel。

3.HSV即Hue(⾊调),Saturation(饱和度)和Value(亮度)三个channel切记(纯属个⼈理解):1.百度百科说,将原来的RGB(R,G,B)中的R,G,B统⼀按照⼀种转换关系⽤Gray替换,形成新的颜⾊RGB(Gray,Gray,Gray),⽤它替换原来的RGB(R,G,B)就是灰度图。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

openCV学习笔记(2)__openCV简单的图片处理(雪花,减少颜色)
openCV简单的图片处理(雪花,减少颜色)
2012年10月12日
22:32
继而,搭建好平台之后,就可以用openCV进行简单的图片处理.这里的笔记,是在这本书(OpenC V_2_Computer_Vision_Application_Programming_Cookbook)的基础上学习的.好,言归正传.
第一个函数,在上一个的main函数里面进行实现.
雪花:(尊重原文,这里用的是原文的salt函数,撒盐``)
首先,是原图的显示:
屏幕剪辑的捕获时间: 2012/11/4 22:33
这次放在E盘,就不用用管理员权限来操作了.继续而这次的函数salt,作用是在图上按照自己需要的点数来添加白点.
源码://被注释掉的东西表示用来玩的说``
屏幕剪辑的捕获时间: 2012/11/4 22:55
大概应该可以看得出,rand()%image.cols 和rand()%image.rows表示的就是图的colum n(纵列)和row(横列),对随机出来的像素进行修改.
对于if else 部分:
图像的组成,用灰度来表示.比如黑白的图像,用灰度图就可以表示出来.如果面对的是彩图,一般按照三基色(红绿蓝)每个像素由3个基本颜色的不同灰度表示,也就是说,如果image 的chan nel为3的时候,需要修改三个channel的参数,而如果单单是黑白,channel只有1,那么只要修改一个参数就可以.
可知,255是一个尽头``` 白色``
函数的主体如下:
屏幕剪辑的捕获时间: 2012/11/4 22:56
//注释的colorReduce是下一个函数
运行结果``如下``:
屏幕剪辑的捕获时间: 2012/11/4 22:58加上10000捏``?
屏幕剪辑的捕获时间: 2012/11/4 22:59
屏幕剪辑的捕获时间: 2012/11/4 23:02如果参数改成0?
屏幕剪辑的捕获时间: 2012/11/4 23:04结果如下:
屏幕剪辑的捕获时间: 2012/11/4 23:05
撒胡椒的说`` 黑色是白色的另外一端``
每一个像素是又一个8-bit的unsigned char型储存,因而色的数目就有256x256x256个.数目之大,因而,下面的函数是用来减少颜色的种类的.
函数主体:
屏幕剪辑的捕获时间: 2012/11/4 23:14
当中的div可以理解为每个灰度级划分的多少.
屏幕剪辑的捕获时间: 2012/11/4 23:19
这个函数体是主要的处理,例如是256色,这个表达就会把[0,div)区间的色素变成div/2的,[di v,2*div)的就会变成3*div/2,把周围附近的色调简化为一个色调.这样对颜色进行了简化.
运行结果如下:
屏幕剪辑的捕获时间: 2012/11/4 23:22效果不太明显.
把div换成是64的话:
屏幕剪辑的捕获时间: 2012/11/4 23:23继续加强的话:
屏幕剪辑的捕获时间: 2012/11/4 23:24
屏幕剪辑的捕获时间: 2012/11/4 23:24
随着分化,颜色表示的单调性会让颜色越来越枯燥.
函数的主体,把salt注释掉,把colorReduce加上就好.记得要在主体前面加上声明,
屏幕剪辑的捕获时间: 2012/11/4 23:26
ps:对于colorReduce的函数,主体还有几个方法: data[i]= data[i] –data[i]%div + div/2;
和上述的方法一样,不过这个是先退回到原点在加上div/2
另外一个,是使用位运算:
uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0 data[i]= (data[i]&mask) + div/2;。

相关文档
最新文档