基于OpenCV的图像处理技术基本知识

展示一个图片

import cv2
def main():
    img=cv2.imread('1.jpg')#读
    cv2.imshow('gray1',img)#窗口展示
    cv2.imwrite('save.png',img)#保存
    cv2.waitKey(0)#等待
if __name__ == '__main__':
	main()

创建一个灰度图像

import numpy as np
import cv2
def main():
    data=[[0,0,0],[0,0,0]]
    img=np.array(data,dtype=np.uint8)
    cv2.imwrite('img_cv2.jpg',img)
    cv2.imshow('img_cv2.jpg',img)
    cv2.waitKey(0)
if __name__ == '__main__':
	main()

复制一个图像把它变成灰度图像

import numpy as np
import cv2
def main():
    img = cv2.imread('1.jpg')
    height,width,n=img.shape#得到图片的宽高和维度
    img2=img.copy()#复制
    for i in range(height):
         for j in range(width):
             img2[i,j]=0#置0,变为灰度图像
    cv2.imshow('img2.jpg', img2)
    cv2.waitKey(0)

if __name__ == '__main__':
    main()

彩色图像通道分离、合并

import numpy as np
import cv2
from cv2 import COLOR_BGR2Lab

def main():
    img = cv2.imread('1.jpg')
    img2=cv2.cvtColor(img,COLOR_BGR2Lab)#固定颜色通道
    r,g,b=cv2.split(img2)
    cv2.imshow("Red",r)
    cv2.imshow("Green", g)
    cv2.imshow('Blue', b)
    img3=cv2.merge([b,g,r])#合并
    cv2.imshow('img3.jpg', img3)
    cv2.waitKey(0)

if __name__ == '__main__':
    main()

彩色图二值化

import numpy as np
import cv2
from cv2 import COLOR_BGR2Lab

def main():
    img = cv2.imread('1.jpg',0)#0是灰度,1是高亮
    #THRESH_BINARY_INV白大于黑   THRESH_BINARY黑大于白   THRESH_TRUNC比原图灰且微透明  THRESH_TOZERO模糊
    thresh1,dst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
    #img输入图,dst输出图,127阈值
    cv2.imshow('dst.jpg', dst)
    cv2.waitKey(0)

if __name__ == '__main__':
    main()

彩色图像转换为灰度图像有三种方法
其一:imread读取图像的时候直接设置参数为0
其二:调用cvtColor()函数,参数设置为cv2.COLOR_BGR2GRAY
其三:调用split()函数

图像的缩放

import numpy as np
import cv2
def main():
    img = cv2.imread('1.jpg')
    cv2.imshow('img.jpg', img)

    height,width,n=img.shape#得到图片的宽高和维度

    downscale=cv2.resize(img,(100,100),interpolation=cv2.INTER_LINEAR)#缩小
    cv2.imshow('downscale.jpg', downscale)

    upscale=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_LINEAR)#放大
    cv2.imshow('upscale.jpg', upscale)

    #[1,0,500],[0,1,50]向左、向右各移动五十个像素
    M=np.array([[1,0,500],[0,1,50]],np.float32)#图像平移
    img_tr=cv2.warpAffine(img,M,img.shape[0:2])#mg.shape[:2]:图像尺寸
    cv2.imshow('imgtr.jpg', img_tr)

    #旋转
    M2=cv2.getRotationMatrix2D((width/2,height/2),45,1)#旋转中心点、旋转角度、图像缩放因子
    img_ro = cv2.warpAffine(img, M2, img.shape[0:2])  # mg.shape[:2]:图像尺寸
    cv2.imshow('imgro.jpg', img_ro)


    cv2.waitKey(0)

if __name__ == '__main__':
    main()

dst=cv2.flip(src, flipCode ,dst=None)

src:输入图像
flipCode:翻转模式,filpCode==0垂直翻转,>0水平翻转(沿y轴),<0水平垂直翻转(先沿x轴,再沿y轴,等价于旋转180度)

绘制灰度图像直方图

import numpy as np
import cv2
from matplotlib import pyplot as plt
def main():
    img = cv2.imread('1.jpg',0)#转为灰度图片
    hist=cv2.calcHist([img],[0],None,[256],[0,256])
    plt.figure()#新建一个图像
    plt.title("灰度图像直方图")#图像的名字
    plt.xlabel("Bins")#x轴
    plt.ylabel("像素")#y轴
    plt.plot(hist)#画图
    plt.xlim([0,256])#设置x轴坐标的范围
    plt.show()
    input()
if __name__ == '__main__':
    main()

所用函数:

hist=cv2.calcHist(images,channel,mask,histSize,range)

[img]:输入图像,要用[]括起来
[channel]:传入图像的通道,如果是灰度图像,那么只有一个通道,值为0;如果是彩色图像(有三个通道),那么在0,1,2中选一个值,对于BGR的各个通道。这个值也要用[]传入
mask:掩膜图像,如果统计整幅图,那么为None;如果要统计部分的直方图,就得构造相应的掩膜来计算
histSize:灰度的个数,需要[]
range:像素值的范围,通常为[0,256]。此外,如果channels的值为[0,1],range为[0,256,0,180],则代表0通道范围是0256,1的通道范围是0180

彩色直方图,展示像素分布

-*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

def main():
    img = cv2.imread("1.jpg")
    chans = cv2.split(img)#按将彩色图像分离为三个单通道的灰度图像
    colors = ('b', 'g', 'r')

    plt.figure()#新建一个图像
    plt.title("Flattened Color Histogram")#图像的标签
    plt.xlabel("Bins")#x轴
    plt.ylabel("# of Pixels")#y轴
    #遍历
    for (chan, color) in zip(chans, colors):
        hist = cv2.calcHist([chan], [0], None, [256], [0, 256])#根据通道计算图像直方图
        plt.plot(hist, color=color)#画图
        plt.xlim([0, 256])#设置x轴坐标范围
    plt.show()#显示图像
    input()


if __name__ == '__main__':
    main()

直方图均衡化,用于提高图像的质量

-*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

def main():
    img = cv2.imread("1.jpg",0)
    eq = cv2.equalizeHist(img)#直方图均衡化,用于提高图像的质量
    cv2.imshow("Histogram Equalization", np.hstack([img, eq]))
    cv2.waitKey(0)


if __name__ == '__main__':
    main()

equalize 函数实现的灰度直方图均衡化算法,就是把直方图的每个灰度值进行归一化处理,
求每种灰度的累积分布,接着得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素。

void equalize(InputArray src, OutputArray dst);

src,输入图像,即源图像,填 Mat 类的对象即可,但需要为 8 位单通道的图像。
dst,输出结果,需要和源图像有一样的尺寸和类型。

局部直方图均衡化

# -*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

def main():
    img = cv2.imread("1.jpg",0)
    clahe = cv2.createCLAHE(5, (8, 8))#创造一个8*8的clash
    dst = clahe.apply(img)#图片切分成8*8的小块
    cv2.imshow("local Histogram Equalization", np.hstack([img, dst]))#两张图片进行对比
    # 显示img直方图
    hist0 = cv2.calcHist([img], [0], None, [256], [0, 256])
    plt.figure()  # 新建一个图像
    plt.title("img灰度图像直方图")  # 图像的名字
    plt.xlabel("Bins")  # x轴
    plt.ylabel("像素")  # y轴
    plt.plot(hist0)  # 画图
    plt.xlim([0, 256])  # 设置x轴坐标的范围
    plt.show()
    #显示dst直方图
    hist = cv2.calcHist([dst], [0], None, [256], [0, 256])
    plt.figure()#新建一个图像
    plt.title("dst灰度图像直方图")#图像的名字
    plt.xlabel("Bins")#x轴
    plt.ylabel("像素")#y轴
    plt.plot(hist)#画图
    plt.xlim([0,256])#设置x轴坐标的范围
    plt.show()
    input()
    cv2.waitKey(0)


if __name__ == '__main__':
    main()
cv2.createCLAHE([, clipLimit[, tileGridSize]])
dst=retval.apply(src)

参数含义:
clipLimit:对比对限制阈值,默认为40;
tileGridSize:直方图均衡的栅格尺寸,输入图像将会按照该尺寸分隔后进行局部直方图均衡,默认是8×8大小;
src:输入图像,8bit单通道;
dst:均衡后的输出图像,类型同src;

图像方向投影

-*- coding: UTF-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

def main():
    sample = cv2.imread("50.jpg")
    target = cv2.imread("5.jpg")
    roi_hsv = cv2.cvtColor(sample, cv2.COLOR_BGR2HSV)#转化成hsv空间
    target_hsv = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)
    cv2.namedWindow("sample", cv2.WINDOW_NORMAL)#namedWindow:建一个显示窗口。
    cv2.imshow("sample", sample)
    cv2.namedWindow("target", cv2.WINDOW_NORMAL)
    cv2.imshow("target", target)

    roiHist = cv2.calcHist([roi_hsv], [0, 1], None, [32, 30], [0, 180, 0, 256])  # 计算样本直方图   [32, 30]越小,效果越好
    cv2.normalize(roiHist, roiHist, 0, 255, cv2.NORM_MINMAX)  # 规划到0-255之间
    dst = cv2.calcBackProject([target_hsv], [0, 1], roiHist, [0, 180, 0, 256], 1)  # 计算反向投影
    cv2.namedWindow("back_projection_demo", cv2.WINDOW_NORMAL)
    cv2.imshow("back_projection_demo", dst)

    cv2.waitKey(0)


if __name__ == '__main__':
    main()

你可能感兴趣的:(python,opencv,图像处理,计算机视觉)