图像处理opencv代码

合集下载

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;。

Python图像处理OpenCV(12):Roberts算子、Prewitt算子、Sobe。。。

Python图像处理OpenCV(12):Roberts算子、Prewitt算子、Sobe。。。

Python 图像处理OpenCV (12):Roberts 算⼦、Prewitt 算⼦、Sobe。

前⽂传送门:引⾔前⽂介绍了 Canny 算⼦边缘检测,本篇继续介绍 Roberts 算⼦、 Prewitt 算⼦、 Sobel 算⼦和 Laplacian 算⼦等常⽤边缘检测技术。

Roberts 算⼦Roberts 算⼦,⼜称罗伯茨算⼦,是⼀种最简单的算⼦,是⼀种利⽤局部差分算⼦寻找边缘的算⼦。

他采⽤对⾓线⽅向相邻两象素之差近似梯度幅值检测边缘。

检测垂直边缘的效果好于斜向边缘,定位精度⾼,对噪声敏感,⽆法抑制噪声的影响。

1963年, Roberts 提出了这种寻找边缘的算⼦。

Roberts 边缘算⼦是⼀个 2x2 的模版,采⽤的是对⾓⽅向相邻的两个像素之差。

Roberts 算⼦的模板分为⽔平⽅向和垂直⽅向,如下所⽰,从其模板可以看出, Roberts 算⼦能较好的增强正负 45 度的图像边缘。

dx =−1001dy =0−11Roberts 算⼦在⽔平⽅向和垂直⽅向的计算公式如下:d x (i ,j )=f (i +1,j +1)−f (i ,j )d y (i ,j )=f (i ,j +1)−f (i +1,j )Roberts 算⼦像素的最终计算公式如下:S =d x (i ,j )2+dy (i ,j )2今天的公式都是⼩学⽣⽔平,千万别再说看不懂了。

实现 Roberts 算⼦,我们主要通过 OpenCV 中的 filter2D() 这个函数,这个函数的主要功能是通过卷积核实现对图像的卷积运算:def filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)src: 输⼊图像ddepth: ⽬标图像所需的深度kernel: 卷积核接下来开始写代码,⾸先是图像的读取,并把这个图像转化成灰度图像,这个没啥好说的:# 读取图像img = cv.imread('maliao.jpg', cv.COLOR_BGR2GRAY)[][]√rgb_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)# 灰度化处理图像grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)然后是使⽤ Numpy 构建卷积核,并对灰度图像在 x 和 y 的⽅向上做⼀次卷积运算:# Roberts 算⼦kernelx = np.array([[-1, 0], [0, 1]], dtype=int)kernely = np.array([[0, -1], [1, 0]], dtype=int)x = cv.filter2D(grayImage, cv.CV_16S, kernelx)y = cv.filter2D(grayImage, cv.CV_16S, kernely)注意:在进⾏了 Roberts 算⼦处理之后,还需要调⽤convertScaleAbs()函数计算绝对值,并将图像转换为8位图进⾏显⽰,然后才能进⾏图像融合:# 转 uint8 ,图像融合absX = cv.convertScaleAbs(x)absY = cv.convertScaleAbs(y)Roberts = cv.addWeighted(absX, 0.5, absY, 0.5, 0)最后是通过 pyplot 将图像显⽰出来:# 显⽰图形titles = ['原始图像', 'Roberts 算⼦']images = [rgb_img, Roberts]for i in range(2):plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i])plt.xticks([]), plt.yticks([])plt.show()最终结果如下:Prewitt 算⼦Prewitt 算⼦是⼀种⼀阶微分算⼦的边缘检测,利⽤像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作⽤。

opencv所有函数汇总

opencv所有函数汇总

opencv所有函数汇总OpenCV是一个开放源代码的计算机视觉和机器学习软件库。

它拥有多种函数和方法,可用于处理图像和视频、目标检测、特征提取、图像分割、图像配准、机器学习等多个领域。

以下是一些常用的OpenCV函数的汇总:1. cv2.imread该函数读取图像文件,并返回一个NumPy数组,该数组表示图像的像素值。

2. cv2.imshow用于在窗口中显示图像。

3. cv2.imwrite将图像保存到指定的文件路径。

4. cv2.cvtColor用于将图像从一个颜色空间转换为另一个颜色空间。

5. cv2.resize可用于调整图像的大小。

6. cv2.flip用于翻转图像。

7. cv2.rectangle绘制矩形框。

8. cv2.circle绘制圆形。

9. cv2.line绘制线条。

10. cv2.putText在图像上绘制文本。

11. cv2.threshold将图像分割为黑白两个阈值。

12. cv2.adaptiveThreshold根据图像不同区域的光照条件对图像进行阈值处理。

13. cv2.medianBlur对图像进行中值滤波。

14. cv2.GaussianBlur对图像进行高斯模糊。

15. cv2.bilateralFilter对图像进行双边滤波。

16. cv2.contourArea计算轮廓的面积。

17. cv2.findContours找到图像中的轮廓。

18. cv2.drawContours在图像上绘制轮廓。

19. cv2.matchTemplate在图像中查找指定模板的匹配项。

20. cv2.HoughCircles在图像中检测圆。

21. cv2.HoughLines在图像中检测直线。

22. cv2.goodFeaturesToTrack在图像中寻找角点。

23. cv2.findHomography计算两个图像之间的单应性矩阵。

24. cv2.warpPerspective将图像进行透视变换。

cv2库函数

cv2库函数

cv2库函数OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。

在OpenCV中,cv2是一个用于Python的库,它提供了大量用于图像处理和计算机视觉任务的函数。

在本文中,我们将介绍一些常用的cv2库函数,以帮助读者更好地了解如何使用OpenCV进行图像处理和计算机视觉任务。

1. 读取和显示图像:cv2.imread()和cv2.imshow()cv2.imread()函数用于读取图像文件,可以指定图像文件的路径和读取模式。

读取的图像会以NumPy数组的形式返回,可以方便地进行后续处理。

cv2.imshow()函数用于显示图像,可以指定窗口的名称和要显示的图像。

通过这两个函数,我们可以快速读取和显示图像文件,方便进行后续处理和分析。

2. 图像的灰度化:cv2.cvtColor()cv2.cvtColor()函数用于将彩色图像转换为灰度图像,可以指定转换的颜色空间。

在图像处理和计算机视觉任务中,常常需要将彩色图像转换为灰度图像进行后续处理,比如边缘检测、特征提取等。

通过cv2.cvtColor()函数,可以方便地进行灰度化处理,为后续任务提供更好的基础。

3. 图像的缩放和裁剪:cv2.resize()和数组切片cv2.resize()函数用于对图像进行缩放操作,可以指定目标图像的大小和缩放模式。

图像缩放是图像处理和计算机视觉任务中常用的操作,可以用于调整图像的大小、改变图像的分辨率等。

除了cv2.resize()函数外,还可以使用NumPy数组的切片操作进行图像的裁剪,实现对图像的局部操作和提取感兴趣的区域。

4. 图像的边缘检测:cv2.Canny()cv2.Canny()函数用于对图像进行边缘检测,可以指定边缘检测的参数和阈值。

边缘检测是图像处理和计算机视觉任务中常用的操作,可以用于检测图像中的边缘和轮廓,提取图像的关键信息。

opencv 影像重采样代码

opencv 影像重采样代码

opencv 影像重采样代码OpenCV是一个广泛应用于计算机视觉任务的开源库。

其中一个常见的任务是影像重采样,即将原始影像调整为新的分辨率。

影像重采样在图像处理和计算机视觉领域中具有重要的作用,它可以用于图像缩放、图像增强、图像配准等应用。

本文将介绍如何使用OpenCV 进行影像重采样,并给出相应的代码示例。

影像重采样的主要目的是调整影像的分辨率,使其适应不同的需求。

在实际应用中,我们经常会遇到需要将影像从一个分辨率调整为另一个分辨率的情况。

例如,当我们需要将高分辨率的影像适应于低分辨率的显示设备时,就需要进行影像重采样。

在OpenCV中,影像重采样可以通过resize函数实现。

该函数的原型如下:```cppvoid resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );```其中,src表示输入影像,dst表示输出影像,dsize表示输出影像的尺寸,fx和fy表示x和y方向的缩放比例,interpolation表示插值方法。

通过调整dsize或fx和fy的值,我们可以实现不同的重采样效果。

在实际应用中,常用的插值方法有最近邻插值、双线性插值和双三次插值。

最近邻插值是一种简单的插值方法,它将目标像素的值设置为最近邻原像素的值。

双线性插值是一种更精确的插值方法,它利用目标像素周围的四个原像素进行插值计算。

双三次插值是一种更高级的插值方法,它利用目标像素周围的16个原像素进行插值计算。

下面是一个使用OpenCV进行影像重采样的示例代码:```cpp#include <opencv2/opencv.hpp>using namespace cv;int main(){// 读取原始影像Mat src = imread("input.jpg");// 定义目标影像尺寸Size dsize(800, 600);// 调整影像分辨率Mat dst;resize(src, dst, dsize, 0, 0, INTER_LINEAR);// 显示结果影像imshow("Resampled Image", dst);waitKey(0);return 0;}```在上述代码中,首先使用imread函数读取原始影像,然后通过调用resize函数将原始影像调整为800x600的分辨率。

opencv的模糊度算法

opencv的模糊度算法

opencv的模糊度算法OpenCV模糊度算法1. 引言模糊度(blur)是图像处理中的重要概念之一,它表示图像中物体轮廓的清晰程度。

在计算机视觉和图像处理领域,我们常常需要衡量图像的模糊度,以便在后续的算法中进行进一步处理,例如在图像识别、图像分割、运动检测等任务中。

OpenCV是一个广泛使用的开源计算机视觉库,提供了丰富的图像处理算法和函数。

本篇文章将介绍一些常用的OpenCV模糊度算法,并给出示例代码。

2. Sobel算子Sobel算子是一种基于图像梯度的算法,用于计算图像的边缘信息。

在计算图像的模糊度时,我们可以使用Sobel算子来检测图像中的边缘信息,进而评估图像的清晰度。

Sobel算子通过对图像进行卷积运算,得到水平和垂直方向上的梯度,从而计算出图像中各点的模糊度。

以下是基于OpenCV的Sobel算子的示例代码:```import cv2import numpy as np# 读取图像image = cv2.imread('image.jpg', 0)# 计算水平和垂直方向上的梯度sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)# 计算模糊度bluriness = np.mean(np.abs(sobel_x) + np.abs(sobel_y))print("Bluriness:", bluriness)```在上述代码中,我们首先使用`cv2.imread`函数读取一张图像,并将其转换为灰度图像。

然后,我们使用`cv2.Sobel`函数计算图像在水平和垂直方向上的梯度。

最后,我们通过计算各点梯度的绝对值之和的均值,得到模糊度。

3. Laplacian算子Laplacian算子是另一种常用的边缘检测算法,可以用来评估图像的模糊度。

Python+OpenCV图像处理(九)——模板匹配

Python+OpenCV图像处理(九)——模板匹配

Python+OpenCV图像处理(九)——模板匹配百度百科:模板匹配是⼀种最原始、最基本的模式识别⽅法,研究某⼀特定对象物的图案位于图像的什么地⽅,进⽽识别对象物,这就是⼀个匹配问题。

它是图像处理中最基本、最常⽤的匹配⽅法。

模板匹配具有⾃⾝的局限性,主要表现在它只能进⾏平⾏移动,若原图像中的匹配⽬标发⽣旋转或⼤⼩变化,该算法⽆效。

简单来说,模板匹配就是在整个图像区域发现与给定⼦图像匹配的⼩块区域。

⼯作原理:在带检测图像上,从左到右,从上向下计算模板图像与重叠⼦图像的匹配度,匹配程度越⼤,两者相同的可能性越⼤。

代码如下:#模板匹配import cv2 as cvimport numpy as npdef template_demo():tpl =cv.imread("E:/imageload/sample1.jpg")target = cv.imread("E:/imageload/target1.jpg")dWindow('template image', cv.WINDOW_NORMAL)cv.imshow("template image", tpl)dWindow('target image', cv.WINDOW_NORMAL)cv.imshow("target image", target)methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED] #3种模板匹配⽅法th, tw = tpl.shape[:2]for md in methods:print(md)result = cv.matchTemplate(target, tpl, md)min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)if md == cv.TM_SQDIFF_NORMED:tl = min_locelse:tl = max_locbr = (tl[0]+tw, tl[1]+th) #br是矩形右下⾓的点的坐标cv.rectangle(target, tl, br, (0, 0, 255), 2)dWindow("match-" + np.str(md), cv.WINDOW_NORMAL)cv.imshow("match-" + np.str(md), target)template_demo()cv.waitKey(0)cv.destroyAllWindows()运⾏结果:注意:1.⼏种常见的模板匹配算法:其中,①TM_SQDIFF是平⽅差匹配;TM_SQDIFF_NORMED是标准平⽅差匹配。

Opencv图像处理:如何判断图片里某个颜色值占的比例

Opencv图像处理:如何判断图片里某个颜色值占的比例

Opencv图像处理:如何判断图⽚⾥某个颜⾊值占的⽐例⼀、功能这⾥的需求是,判断摄像头有没有被物体遮挡。

这⾥只考虑⽤⼿遮挡---->判断⿊⾊颜⾊的范围。

⼆、使⽤OpenCV的Mat格式图⽚遍历图⽚下⾯代码⾥,传⼊的图⽚的尺⼨是640*480,判断⿊⾊范围。

/*在图⽚⾥查找指定颜⾊的⽐例*/int Widget::Mat_color_Find(QImage qimage){Mat image = QImage2cvMat(qimage);//将图⽚加载进来int num = 0;//记录颜⾊的像素点float rate;//要计算的百分率//遍历图⽚的每⼀个像素点for(int i = 0; i < image.rows;i++) //⾏数{for(int j = 0; j <image.cols;j++) //列数{//对该像素是否为指定颜⾊进⾏判断 BGR 像素点//OpenCV 中 MAT类的默认三原⾊通道顺序BGR/*动态地址访问像素语法:image.at<Vec3b>(i,j)[0]、image.at<uchar>(i, j)访问三通道图像的单个像素:int b = image.at<Vec3b>(i, j)[0];int g = image.at<Vec3b>(i, j)[1];int r = image.at<Vec3b>(i, j)[2];对于三通道图像,每个像素存储了三个值,分别为蓝⾊、绿⾊、红⾊通道上的数值。

int gray_data = image.at<uchar>(i, j);⽤来访问灰度图像的单个像素。

对于灰度图像,每个像素只存储⼀个值*/if((image.at<Vec3b>(i, j)[0] <= 120 &&image.at<Vec3b>(i, j)[1] <= 120 &&image.at<Vec3b>(i, j)[2] <= 120)){num++;}}}rate = (float)num / (float)(image.rows * image.cols);//阀值为 0.249255 表⽰为全⿊if(rate>0.20){qDebug()<<":Mat:故意遮挡摄像头";}qDebug()<<"Mat:⽐例"<<rate;return 0;}Mat Widget::QImage2cvMat(QImage image){Mat mat;switch(image.format()){case QImage::Format_ARGB32:case QImage::Format_RGB32:case QImage::Format_ARGB32_Premultiplied:mat = Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());break;case QImage::Format_RGB888:mat = Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());cvtColor(mat, mat, CV_BGR2RGB);break;case QImage::Format_Indexed8:mat = Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());break;}}三、使⽤QImage遍历像素点/*在图⽚⾥查找指定颜⾊的⽐例*/int Widget::qimage_color_Find(QImage qimage){int num = 0;//记录颜⾊的像素点float rate;//要计算的百分率quint8 r,g,b;//遍历图⽚的每⼀个像素点for(int i = 0; i < qimage.height();i++) //⾏数{for(int j = 0; j <qimage.width();j++) //列数{QRgb rgb=qimage.pixel(j,i);r=qRed(rgb);g=qGreen(rgb);b=qBlue(rgb);if((r <= 120 && g <= 120 && b <= 120)){num++;}}}rate = (float)num / (float)(qimage.height() * qimage.width());//阀值为 0.99777 表⽰为全⿊if(rate>0.60){//qDebug()<<"qimage:故意遮挡摄像头";}qDebug()<<"qimage:⽐例:"<<rate;return 0;}补充知识:判断⼀批图⽚中含有某中颜⾊物体的图⽚个数占总图⽚的⽐例最近在做⼀个语义分割项⽬,使⽤Label⼯具进⾏了类别的标注.然后不同类别⽣成了不同的颜⾊,如需要代码可以参考.后来我想统计⼀下含有⼀种类别的图⽚和含有两种类别的图⽚占总图⽚的⽐例,下⾯是我的代码:代码思路:1)循环读取⽂件夹中的图⽚2)循环读取图⽚的每⼀个像素点,当图⽚的像素点和你检测的物体像素点⼀致时,对应类别加1.3)读取完图⽚后计算每⼀类的⽐例.import cv2import osimport matplotlib.pyplot as pltpicture_path="/home/wsb/桌⾯/picture"picture_list=os.listdir(picture_path)total_picture=len(picture_list)total=total_pictureper=[]number=0#图⽚中道路类型为1的个数number1=0#⼀种道路类型并且⽐例⼩于0.0638的个数number2=0for item in picture_list:src = os.path.join(os.path.abspath(picture_path), item)print("start: %s "%item)total_picture-=1mat=cv2.imread(src)height=mat.shape[0]width=mat.shape[1]ground=0zero=0one=0two=0four=0five=0six=0seven=0eight=0rateground=0rate0=0rate1=0rate2=0rate3=0rate4=0rate5=0rate6=0rate7=0rate8=0rate=0road_type=0for i in range(height):for j in range(width):# print("r:%s"%mat[i][j][0])# print("r:%s"%mat[i][j][1])# print("r:%s"%mat[i][j][2])'''我这⾥共有9种分类情况,况且我已知道每⼀种颜⾊的具体rgb值,我将它们作为我的判断条件如不你不知道可以在⽹上查找⾃⼰想查看⽐例的rgb值或者范围'''if mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==0:ground+=1elif mat[i][j][0]==128 and mat[i][j][1]==0 and mat[i][j][2]==0:zero+=1elif mat[i][j][0]==0 and mat[i][j][1]==128 and mat[i][j][2]==0:one+=1elif mat[i][j][0]==128 and mat[i][j][1]==128 and mat[i][j][2]==0:two+=1elif mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==128:three+=1elif mat[i][j][0]==128 and mat[i][j][1]==0 and mat[i][j][2]==128:four+=1elif mat[i][j][0]==0 and mat[i][j][1]==128 and mat[i][j][2]==128:five+=1elif mat[i][j][0]==128 and mat[i][j][1]==128 and mat[i][j][2]==128:six+=1elif mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==64:seven+=1elif mat[i][j][0]==0 and mat[i][j][1]==0 and mat[i][j][2]==192:eight+=1else:print("输⼊正确的图⽚,或者更改上⾯判断条件的像素值")rateground=ground/(height*width)rate0=zero/(height*width)if rate0!=0:road_type+=1rate1=one/(height*width)if rate1!=0:road_type+=1rate2=two/(height*width)if rate2!=0:road_type+=1rate3=three/(height*width)if rate3!=0:road_type+=1rate4=four/(height*width)if rate4!=0:road_type+=1rate5=five/(height*width)if rate5!=0:road_type+=1rate6=six/(height*width)if rate6!=0:road_type+=1rate7=seven/(height*width)if rate7!=0:road_type+=1rate8=eight/(height*width)road_type+=1rate=rate0+rate1+rate2+rate3+rate4+rate5+rate6+rate7+rate8per.append(rate)if road_type==1:number+=1if rate<0.0638:number1+=1#⼀种类型道路并且所占⽐例⼩于0.0638的情况else:if rate<0.532:number2+=1#两种道路类型,并且正确正确道路类型所占⽐例⼩于0.532时的个数print("the remaining %d"%total_picture)A=number/total#图⽚中道路类型⼤于1种的概率A1=number1/total#图⽚中⼀种道路类型并且⽐例⼩于0.0638的概率A2=number2/total#图⽚中有两种道路,并且⼀种道路所占⽐例⼩于0.532时的概率print("A1:%s"%A1)print("the precentage of one road is %s"%A)print("the precentage of two road is %s"%(1-A))print("A2:%s"%A2)plt.plot(per)plt.ylabel('the percentage of road')plt.show()以上这篇Opencv图像处理:如何判断图⽚⾥某个颜⾊值占的⽐例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CmymfcDlg对话框
CmymfcDlg::CmymfcDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CmymfcDlg::IDD, pParent)
//使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
//这将由框架自动完成。
void CmymfcDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); //用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
}
void CmymfcDlg::OnBnClickedReadimg() //读取图片操作
{
// TODO:在此添加控件通知处理程序代码
//这里用CFileDialog来选择图片
CFileDialog dlg(
TRUE, _T("*.bmp"), NULL,
OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
//更新windows窗口,如果无这步调用,图片显示还会出现问题
//ShowImage( TheImage, IDC_ShowImg );
//重绘图片函数
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CmymfcDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
ON_BN_CLICKED(IDC_MedianBlur, &CmymfcDlg::OnBnClickedMedianblur)
ON_BN_CLICKED(IDC_Gaussian, &CmymfcDlg::OnBnClickedGaussian)
ON_BN_CLICKED(IDC_BothSide, &CmymfcDlg::OnBnClickedBothside)
int y = (rect.Height() - cyIcon + 1) / 2;
//绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
CDialog::OnPaint();
//重绘对话框
CDialog::UpdateWindow();
ON_BN_CLICKED(IDC_CImage, &CmymfcDlg::OnBnClickedCimage)
ON_BN_CLICKED(IDC_Mirror, &CmymfcDlg::OnBnClickedMirror)
ON_BN_CLICKED(IDC_CColor, &CmymfcDlg::OnBnClickedCcolor)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。对于使用文档/视图模型的MFC应用程序,
}
BEGIN_MESSAGE_MAP(CmymfcDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ReadImg, &CmymfcDlg::OnBnClickedReadimg)
//用于应用程序“关于”菜单项的CAboutDlg对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
//对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV支持
ReleaseDC( pDC );
}
void CmymfcDlg::ResizeImage(IplImage* img)
{
//读取图片的宽和高
int w = img->width;
int h = img->height;
//找出宽和高中的较大值者
int max = (w > h)? w: h;
//计算将C
CDC* pDC = GetDlgItem( ID ) ->GetDC();
//获取HDC(设备句柄)来进行绘图操作
HDC hDC = pDC ->GetSafeHdc();
CRect rect;
GetDlgItem(ID) ->GetClientRect( &rect );
ON_BN_CLICKED(IDC_Equally, &CmymfcDlg::OnBnClickedEqually)
ON_BN_CLICKED(IDC_Corrosion, &CmymfcDlg::OnBnClickedCorrosion)
ON_BN_CLICKED(IDC_Dilate, &CmymfcDlg::OnBnClickedDilate)
_T("All Files (*.*) |*.*|image files (*.bmp; *.jpg)|*.bmp; *.jpg ||"), NULL
);
//打开文件对话框的标题名
dlg.m_ofn.lpstrTitle = _T("Open Image");
//判断是否获得图片
if( dlg.DoModal() != IDOK )
//求出图片控件的宽和高
int rw = rect.right - rect.left;
int rh = rect.bottom - rect.top;
//读取图片的宽和高
int iw = img->width;
int ih = img->height;
//使图片的显示位置正好在控件的正中
int tx = (int)(rw - iw)/2;
ON_BN_CLICKED(IDC_Sobel, &CmymfcDlg::OnBnClickedSobel)
ON_BN_CLICKED(IDC_Laplace, &CmymfcDlg::OnBnClickedLaplace)
ON_BN_CLICKED(IDC_FFT2, &CmymfcDlg::OnBnClickedFft2)
ImgSize.width = IMAGE_WIDTH;
TheImage = cvCreateImage( ImgSize, IPL_DEPTH_8U, IMAGE_CHANNELS );
// IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
//执行此操作
SetIcon(m_hIcon, TRUE);//设置大图标
SetIcon(m_hIcon, FALSE);//设置小图标
// TODO:在此添加额外的初始化代码
return TRUE; //除非将焦点设置到控件,否则返回TRUE
}
void CmymfcDlg::OnSysCommand(UINT nID, LPARAM lParam)
#include "stdafx.h"
#include "mymfc.h"
#include "mymfcDlg.h"
#include "afxdialogex.h"
#include <opencv2/opencv.hpp>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
float scale = (float) ( (float) max / 256.0f );
//缩放后图片的宽和高
int nw = (int)( w/scale );
int nh = (int)( h/scale );
//为了将缩放后的图片存入TheImage的正中部位,需计算图片在TheImage左上角的期望坐标值
, TheImage(NULL)
, rePath(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CmymfcDlg::DoDataExchange(CDataExchange* pDX)
相关文档
最新文档