image.shape
opencv图像数据实际上是numpy数组数据结构。
import cv2
image=cv2.imread("D:\opencv_logo.jpg")
print(image.shape)
输出(250, 250, 3)
第一个值 250 表示图像的高度(行数)。
第二个值 250 表示图像的宽度(列数)。
第三个值 3 表示图像的通道数,通常是指 RGB(红绿蓝)三个颜色通道。
所以 (250, 250, 3) 表示读取的图像是一个高度为 250 像素、宽度为 250 像素,且具有 3 个颜色通道的图像。
这个信息对于深入了解图像的尺寸和通道数,以及后续对图像进行处理和分析非常重要。
颜色存储
opencv对颜色的存储顺序是BGR
对于opencv,存储一张彩色图片,等同于存储三张灰度图
cv2.imshow("image",image)
cv2.imshow("blue",image[:,:,0])
cv2.imshow("green",image[:,:,1])
cv2.imshow("red",image[:,:,2])
cv2.waitKey(0)
cv2.destroyAllWindows()
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
这段代码将读取的图像变为灰度图,将图像从彩色(BGR)空间转换为灰度空间。
灰度图像只有一个通道(即只有灰度值),而且灰度值表示每个像素的亮度和暗度,而不是颜色。将图像转换为灰度可以减少图像处理和计算量,通常在进行图像处理、分析和识别时会用到灰度图像。
实际上是将BGR三原色平均,某种程度描述了图像明暗分布。
图像裁剪
crop=image[10:175,40:210]
cv2.imshow("crop",crop)
cv2.waitKey(0)
cv2.destroyAllWindows()
10:175对应第10横行到第175横行
40:210对应第20竖行到第210竖行
图形绘制
创建黑色画布
import numpy as np
image = np.zeros([300,300,3],dtype=np.uint8)
cv2.imshow("image",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制图形
使用opencv绘制一条直线。
线段起点(50,50),终点(250,250),颜色(255,255,255)即白色,线段粗细2个像素。
cv2.line(image,(50,50),(250,250),(255,255,255),2)
cv2.imshow("image",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
同理,再绘制一个绿色的矩形和一个红色的圆形
cv2.rectangle(image,(30,100),(100,150),(0,255,0),2)
cv2.circle(image,(200,200),100,(0,0,255),3)
cv2.imshow("image",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
绘制字符串
使用opencv绘制字符串
cv2.putText(image,"opencv",(50,50),0,1,(255,255,255),2,1)
cv2.imshow("image",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
字体序号0(默认字体),缩放系数1,颜色白色,粗细两个像素,线条类型1(实线)
均值滤波
高斯滤波
高斯滤波器是一种线性滤波器。它通过对图像像素周围的像素进行加权平均来实现图像模糊和去噪。在高斯滤波中,像素的加权平均值是根据高斯分布函数来计算的,这也是它被称为高斯滤波的原因。
高斯滤波器对于去除高斯噪声(即呈高斯分布的噪声)效果较好,同时对于保留图像的边缘和细节有一定的效果。参数 sigma 用来调节模糊程度。
image=cv2.imread("D:\snowman.jpg")
gauss=cv2.GaussianBlur(image,(5,5),0)
cv2.imshow("image",image)
cv2.imshow("gauss",gauss)
cv2.waitKey(0)
cv2.destroyAllWindows()
对图像 image 进行高斯模糊处理,将模糊后的图像保存在 gauss 变量中。模糊核的大小为 (5,5),标准差 sigma 的值为 0。
从运行结果看出,图像噪点明显减少,但也破坏了一些图像细节。
中值滤波器
中值滤波器是一种基于排序统计学原理的非线性滤波器。中值滤波器可以对象断点、脉冲噪声等进行有效去除,特别适用于去除椒盐噪声。中值滤波器的核心思想是将图像像素周围的像素按照一定的规则排列(如升序或降序),然后选取排序后的某个位置的像素值(通常是中间的值)作为该像素的新值。
由于中值滤波器是基于排序统计学原理的,因此对于存在频繁的噪声干扰或局部突变的图像具有较好的去噪效果。
median=cv2.medianBlur(image,5)
cv2.imshow("image",image)
cv2.imshow("median",median)
cv2.waitKey(0)
cv2.destroyAllWindows()
从运行结果可以看出,噪点进一步减少。
图像特征提取
image=cv2.imread("D:\opencv_logo.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,500,0.1,10)
for corner in corners:
x,y=corner.ravel()
cv2.circle(image,(int(x),int(y)),3,(255,0,255),-1)
cv2.imshow("corners",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
函数检测图像中的角点。这个函数的参数包括图像、最大角点数量、角点的品质因子和最小角点间距。检测到的角点被存储在 corners 变量中。
在所有检测到的点上画一个紫色的圆形。
从运行结果可以看出,识别出的特征都是图形的转角。
请出小猪吹风机女士: