Python-opencv读取图片、灰度处理、反色处理、灰度直方图与均衡化处理、分段线形变换处理、图片处理帧差法/视频异常事件检测

本博客是Python-opencv的基本操作,是刚开始使用opencv学习图像处理时都会用到的。如果没有使用过opencv的同学记得在编译代码前安装一下哦。

opencv读取图片

导入opencv,读取初始图片并显示。D:/jupyterwork/test.png是我存储图片的位置,图片文件命名为test.png,后面的代码同理。代码如下。
读取图片那一行代码,后面值为1是正常彩色图片,如果改为0则会显示灰度图。

import cv2
src = cv2.imread("D:/jupyterwork/test.png",1) #读取图片

cv2.imshow("src",src) #显示
cv2.waitKey(0)

opencv反色处理

对图片进行反色处理。代码如下。

import cv2
src = cv2.imread("D:/jupyterwork/test1.png",1) #读取图片
img = 255 - src #反色
cv2.imshow("img",img)#显示
cv2.imshow("src",src)
cv2.waitKey(0)

opencv灰度处理

对图片进行灰度处理。代码如下。

import cv2
src = cv2.imread("D:/jupyterwork/test1.png",0)
print(src.shape)
cv2.imshow("src",src)
cv2.waitKey(0)

直方图均衡化

直方图均衡化。代码如下。

import cv2
img = cv2.imread( "D:/jupyterwork/test1.png",0)
dst2 = cv2.equalizeHist(img)  #直方图均衡化
cv2.imshow("img",img)
cv2.imshow("equalizeHist",dst2)
print (img.shape)
cv2.waitKey(0)

图片处理帧差法/视频异常事件检测

图片处理帧差法,视频异常事件检测。这是对视频进行处理,D:/jupyterwork/123.mp4是我存储视频的位置,视频文件名字为123.mp4。视频需要是背景静止,但是有东西在运动(变化)的效果会比较明显。
代码如下。

import cv2
cap = cv2.VideoCapture('D:/jupyterwork/123.mp4')
ret, frame = cap.read()
prevframe = frame    #第一帧
while True:
    ret, frame = cap.read()
    nextframe = frame
    if ret:
        diff = cv2.absdiff(prevframe,nextframe)
        cv2.imshow('video', diff)
        prevframe = nextframe   #帧差法 背景变化
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
    else:
        break
cv2.destroyAllWindows()
cap.release()

灰度直方图与均衡化处理

灰度直方图与均衡化处理。代码如下。
均衡化处理后,感觉图片要更亮一些,高光高亮的部分变多了。

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import collections

#计算灰度图的直方图
def clczhifangtu(gray) :
    hist_new = []
    num = []
    hist_result = []
    hist_key = []
    gray1 = list(gray.ravel())
    obj = dict(collections.Counter(gray1))
    obj = sorted(obj.items(),key=lambda item:item[0])
    for each in obj :
        hist1 = []
        key = list(each)[0]
        each =list(each)[1]
        hist_key.append(key)
        hist1.append(each)
        hist_new.append(hist1)
    
    #检查从0-255每个通道是否都有个数,没有的话添加并将值设为0
    for i in range (0,256) :
        if i in hist_key :
            num = hist_key.index(i)
            hist_result.append(hist_new[num])
        else :
            hist_result.append([0])
    if len(hist_result) < 256 :
        for i in range (0,256-len(hist_result)) :
            hist_new.append([0])
    hist_result = np.array(hist_result)
    return hist_result

#计算均衡化
def clcresult(hist_new ,lut ,gray) :
    sum = 0
    Value_sum = []
    hist1 = []
    binValue = []
    for hist1 in hist_new :
        for j in hist1:
            binValue.append(j)
            sum += j
            Value_sum.append(sum)

    min_n = min(Value_sum)
    max_num = max(Value_sum)
    # 生成查找表
    for i, v in enumerate(lut):
        lut[i] = int(254.0 * Value_sum[i] / max_num + 0.5)
    # 计算
    result = lut[gray]
    return result

def main() :
    image = cv2.imread(r'D:/jupyterwork/test1.png')
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
    # 创建空的查找表
    lut = np.zeros(256, dtype=gray.dtype)
    #直方图转化
    hist_new = clczhifangtu(gray)
    #并绘制直方图
    plt.plot(hist_new)
    plt.show()
    
    result = clcresult(hist_new,lut,gray)
    cv2.imshow('yuantu',gray)
    cv2.imshow("Result",result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

main()

运行结果如下:
在这里插入图片描述
在这里插入图片描述

分段线形变换处理

分段线形变换处理。代码如下。
感觉分段线形处理跟均衡化处理一致的地方是也让图片更白更亮了一些。但与均衡化处理不同的地方在于,白的区域更多更亮了,某些位置甚至有一点过曝的感觉了。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
 
# 绘制直方图函数
def grayHist(img):
    h, w = img.shape[:2]
    pixelSequence = img.reshape([h * w, ])
    numberBins = 256
    histogram, bins, patch = plt.hist(pixelSequence, numberBins,facecolor='black', histtype='bar')
    plt.xlabel("gray label")
    plt.ylabel("number of pixels")
    plt.axis([0, 255, 0, np.max(histogram)])
    plt.show()
 
img = cv.imread("D:/jupyterwork/test1.png", 0)
out = 2.0 * img
# 进行数据截断,大于255的值截断为255
out[out > 255] = 255
# 数据类型转换
out = np.around(out)
out = out.astype(np.uint8)
# 分别绘制处理前后的直方图
grayHist(img)
grayHist(out)
cv.imshow("img", img)
cv.imshow("out", out)
cv.waitKey()

运行结果如下:
在这里插入图片描述
在这里插入图片描述

原创文章 41 获赞 65 访问量 8373

猜你喜欢

转载自blog.csdn.net/weixin_44436677/article/details/105806407