1、cv2.imread()函数的filename参数不接受带有中文的路径.
2、cv2.waitKey(n ms) 等待 n毫秒 并检测是否有键盘输入,有则返回ASCII码,没有则返回-1。
3、# cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。
# 如果 你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删 除的窗口名。
********enumerate用法,返回索引下标,及对应元素**************
for i, color in enumerate(color):
print(i,color)
0 b
1 g
2 r
********************plt画图坐标************
#从[-1,1]中等距去50个数作为x的取值
x=np.linspace(-1,5,6)
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在指定的间隔内返回均匀间隔的数字。
返回num均匀分布的样本,在[start, stop]
y=x+1
#设置参数范围
plt.xlim((-1,6))
#设置点的位置 坐标轴显示和精度
new_ticks = np.linspace(-1,6,10)#范围0-6,10个刻度
plt.xticks(new_ticks)
4、计算运行时间:
t2=cv.getTickCount()
print((t2-t1)/cv.getTickFrequency())
三通道分离
print(img.shape)
#[512,512,3]
b, g, r = cv2.split(img)
#B,G,R三个通道分离
b.shape
#[512,512]
5、numpy:
print(img[:,:,0].shape)
(400, 400)#二维
6、
m3=np.array([2,3,4],[4,5,6],[7,8,9],np.uint32)
出现错误:
ValueError: only 2 non-keyword arguments accepte
m3=np.array([[2,3,4],[4,5,6],[7,8,9]],np.uint32)
7、色彩空间转换函数
hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
8、
问题:在pycharm中点击run运行程序,发现没有打开run窗口,而是打开的Python console窗口。
解决方法:打开菜单栏run->edit configurations,把下图中的复选框取消就可以了。
9、
hsv = cv.cvtColor(src, cv.COLOR_BGR2YUV)
low_hav = np.array([37, 43, 46])
upper_hav = np.array([77, 255, 255])
mask = cv.inRange(hsv, lowerb=low_hav, upperb=upper_hav)
转换色彩空间,提取二值图像
10、加减乘除,与或非异或
cv.add()
cv.subtract()
cv.divede()
cv.multiply()
cv.bitwise_and()
cv.bitwise_or()
cv.bitwise_not()
cv.bitwise_Xor()
11、均值模糊
基于卷积
#均值模糊
cv.blur(src,[5,5])#5*5个像素
中值模糊(去一些坏点,去噪声)
cv.medianBlur(src,5)
11、提取指定颜色
根据官方文档学习使用cv2.cvtColor()、cv2.inRange()和cv2.bitwise_and()方法。通过使用cv2.cvtColor()将图片转换为hsv颜色空间形式的图片,再通过cv2.inRange()得到mask画面,再用cv2.bitwise_and()方法将原图与mask图片融合,最终得到需要找到特定颜色的区域
#提取颜色
# define range of blue color in HSV
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv, lower_blue, upper_blue)
#打印颜色两种方法
1、
upper = np.array([60, 255, 255])
upper = cv2.cvtColor(upper, cv2.COLOR_HSV2BGR)
upper = totuple(upper/-255)
print(upper)
plt.imshow([[upper]])
2、
color_value = np.uint([[[30,182,253]]])
color_hsv_value = cv2.cvtColor(color_value, cv2.COLOR_BGR2HSV)
print(color_hsv_value)
12、直方图函数
matplotlib.pyplot.hist(
x, bins=10, range=None, normed=False,
weights=None, cumulative=False, bottom=None,
histtype=u'bar', align=u'mid', orientation=u'vertical',
rwidth=None, log=False, color=None, label=None, stacked=False,
hold=None, **kwargs)
x: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
facecolor: 直方图颜色
edgecolor: 直方图边框颜色
alpha: 透明度
histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
返回值 :
n: 直方图向量,是否归一化由参数normed设定
bins: 返回各个bin的区间范围
patches: 返回每个bin里面包含的数据,是一个list
#coding=utf-8
import cv2
import numpy as np
image = cv2.imread("D:/histTest.jpg", 0)
hist = cv2.calcHist([image],
[0], #使用的通道
None, #没有使用mask
[256], #HistSize
[0.0,255.0]) #直方图柱的范围
其中第一个参数必须用方括号括起来。
第二个参数是用于计算直方图的通道,这里使用灰度图计算直方图,所以就直接使用第一个通道;
第三个参数是Mask,这里没有使用,所以用None。
第四个参数是histSize,表示这个直方图分成多少份(即多少个直方柱)。第二个例子将绘出直方图,到时候会清楚一点。
第五个参数是表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素。
最后是两个可选参数,由于直方图作为函数结果返回了,所以第六个hist就没有意义了(待确定)
最后一个accumulate是一个布尔值,用来表示直方图是否叠加。
彩色图像不同通道的直方图
三通道分离直方图
def calcAndDrawHist(image, color):
hist= cv2.calcHist([image], [0], None, [256], [0.0,255.0])
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(hist)
histImg = np.zeros([256,256,3], np.uint8)
hpt = int(0.9* 256);
for h in range(256):
intensity = int(hist[h]*hpt/maxVal)
cv2.line(histImg,(h,256), (h,256-intensity), color)
return histImg;
if __name__ == '__main__':
img = cv2.imread("D:/lena.jpg")
b, g, r = cv2.split(img)
histImgB = calcAndDrawHist(b, [255, 0, 0])
histImgG = calcAndDrawHist(g, [0, 255, 0])
histImgR = calcAndDrawHist(r, [0, 0, 255])
cv2.imshow("histImgB", histImgB)
cv2.imshow("histImgG", histImgG)
cv2.imshow("histImgR", histImgR)
cv2.imshow("Img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
三通道一起直方图
def image_hist(image): #画三通道图像的直方图
color = ('b', 'g', 'r') #这里画笔颜色的值可以为大写或小写或只写首字母或大小写混合
for i , color in enumerate(color):
hist = cv.calcHist([image], [i], None, [256], [0, 256]) #计算直方图
plt.plot(hist, color)
plt.xlim([0, 256])
plt.show()
均衡化原理
首先对各个灰度值做频数统计,计算其概率,根据像素的灰度值计算出累积概率,最后将累积概率 * (255-0) 做为函数映射后的灰度值,
这样做的目的,可以使得灰度值之间的间隔更小,即一些频数较大的灰度值补充给了频数较小的灰度值,从而实现了灰度值的均衡化
直方图均衡化(增强对比度,细节不会增强,由于整体亮度的提升,也会使得局部图像的细节变得模糊)
def equalHist_demo(image):
gray=cv2.cvtcolor(image, cv2.COLOR_BGR2GRAY)
dst=cv2.equalizeHist(gray)
cv2.imshow("equautist_demo", dst)
自适应均衡化图像(细节也会增强)
cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8)) 用于生成自适应均衡化图像
参数说明:clipLimit颜色对比度的阈值, titleGridSize进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
# 使用自适应直方图均衡化
# 第一步:实例化自适应直方图均衡化函数
clahe = cv2.createCLAHE(clipLimit=2.0,
tileGridSize=(8, 8))
# 第二步:进行自适应直方图均衡化
clahe = clahe.apply(img)
# 第三步:进行图像的展示
cv2.imshow('imgs', np.hstack((img, ret, clahe)))
cv2.waitKey(0)
cv2.destroyAllWindows()
限制对比度自适应直方图均衡(CLAHE算法)进行预处理有时可以增加识别的准确率
import cv2
path = '1.jpg'
image = cv2.imread(path,cv2.IMREAD_COLOR)
cv2.imwrite('image.jpg',image,[cv2.IMWRITE_JPEG_QUALITY, 50])
b,g,r = cv2.split(image)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
b = clahe.apply(b)
g = clahe.apply(g)
r = clahe.apply(r)
image = cv2.merge([b,g,r])
cv2.imwrite('clahe.jpg',image,[cv2.IMWRITE_JPEG_QUALITY, 50])