opencv-python笔记-基础与直方图均衡

 

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])

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值