图像上的算数运算、阈值处理和平滑处理

图像加法

可以使用函数 cv2.add() 将两幅图像进行加法运算,也可以直接使用 numpy,new=img+img1。两幅图像的大小,类型必须一致.第二个图像可以用一个标量值。
import numpy as np
import cv2 
img = cv2.imread('kn.jpg')

img1 = img+10    #加法运算

cv2.imshow('pic',img)
cv2.imshow('pic1',img1)

print(img[:5,:,0])
print(img1[:5,:,0])
cv2.waitKey(0)
cv2.destroyAllWindows()

相当于原图所有位置 的像素点都加10,图像shape值不变


用cv2.add()加

OpenCV 的加法是一种饱和操作,而 Numpy 的加法是一种模操作。
import cv2
import numpy as np
img = cv2.imread('kn.jpg')

# img1 = img+10            #像素值加10 超过255取255
img1 = cv2.add(img,10)     #像素值加完结果再对256取余

cv2.imshow('pic',img)
cv2.imshow('pic1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 的结果更好 一点


图像混合

混合= α * img1 + β  * img2 + γ     (α,β <1)       (β=1-α)        γ : 亮度调节量 
函数 cv2.addWeighted() 可以按上面的公式对图片进行混合操作
权重不同,就会给人一种透明的感觉
import cv2
import numpy as np
img1=cv2.imread('km.jpg')
img2=cv2.imread('kn.jpg')

pic=cv2.addWeighted(img1,0.4,img2,0.6,0)    #混合

cv2.imshow('pic',pic)
cv2.waitKey(0)
cv2.destroyAllWindows()

修改图像shape可以用cv2.resize()函数

img=cv2.imread('km.jpg')
img1=cv2.resize(img,(1000,1000))   #加上fx=3,fy=1  可调节比例


 图像阈值处理

需要函数cv2.threshold( src, thresh , maxval , type )

该函数有两个返回值ret, dst 表示阈值和输出图像

        src输入单通道图像,通常为灰度图

        thresh:阈值

        maxval当像素超过了阈值(或者小于阈值,根据type决定)所赋予的值

        type二值化操作的类型,包含以下五种类型:

                cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

                cv2.THRESH_BINARY_INV     对上取反操作

                 cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

                

                 cv2.THRESH_TOZERO 大于阈值部分不变,其余设为0

                cv2.THRESH_TOZERO_INV 对上取反操作


import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('op.jpg',0)

ret,thresh1=cv2.threshold(img,130,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,130,255,cv2.THRESH_BINARY_INV)
ret,thresh3=cv2.threshold(img,130,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,130,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,130,255,cv2.THRESH_TOZERO_INV)

titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])    #设置坐标轴为空
plt.show()


平滑处理

就是对图像上每一个像素点进行变换


 1、均值滤波

用卷积框覆盖区域所有像素的平均值来代替中心元素

使用函数cv2.blur( src , ksize) 

        src:图像

        ksize:构造卷积核的大小,所有元素为1,求内核区域像素平均值作为中心值

                要取奇数   如(3,3)       

import numpy as np
import cv2

img = cv2.imread('kv.jpg')

blur = cv2.blur(img,(3,3))    #均值滤波处理

cv2.imshow('pic',img)
cv2.imshow('pic1',blur)

cv2.waitKey(0)
cv2.destroyAllWindows()


2、方框滤波

基本和均值一样,可以选择归一化

使用函数 cv2.boxFilter(img, -1, ksize, normalize=True )

        normalize=True ,结果与均值滤波相同,normalize=FALSE,只求和返回,和大于255取255

import numpy as np
import cv2
img = cv2.imread('kv.jpg')

box= cv2.boxFilter(img,-1,(3,3),normalize=True)
box1 = cv2.boxFilter(img,-1,(3,3),normalize=False)

cv2.imshow('pic',img)
cv2.imshow('pic1',box)
cv2.imshow('pic2',box1)
cv2.waitKey(0)
cv2.destroyAllWindows()


高斯滤波

相当于自己构造了一个权重矩阵,更重视中间的值,里面的值符合高斯分布,方框中心的值最大,其余方框根据距离中心元素的距离递减。原来的求平均数现在变成求加权平均数,权就是方框里的值

GaussianBlur(src,ksize,sigmaX)

        sigmax:X方向上的高斯核标准偏差。

        高斯函数沿 X,Y 方向的标准差,如果只指定了 X 方向的的标准差,Y 方向也会取相同值。

import numpy as np
import cv2
img = cv2.imread('kv.jpg')

Gaussian = cv2.GaussianBlur(img,(3,3),1)    #高斯滤波

cv2.imshow('pic',img)
cv2.imshow('pic1',Gaussian)
cv2.waitKey(0)
cv2.destroyAllWindows()


中值滤波

取中位数替代中心值

使用函数 cv2.medianBlur(src, ksize)

import numpy as np
import cv2
img = cv2.imread('kv.jpg')

median = cv2.medianBlur(img,5)      #中值滤波

cv2.imshow('pic',img)
cv2.imshow('median',median)
cv2.waitKey(0)
cv2.destroyAllWindows()


展示所有图片

使用函数 np.hstack(  图片名,可输入多个) np.vstack()返回图片为纵向,hstack为横向

返回的图片连在一起

import numpy as np
import cv2
img = cv2.imread('kv.jpg')

blur = cv2.blur(img,(3,3))                    #均值滤波
Gaussian = cv2.GaussianBlur(img,(3,3),1)      #高斯滤波
median = cv2.medianBlur(img,5)                #中值滤波

res = np.hstack((blur,Gaussian,median))
print(res)
cv2.imshow('median vs average',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

均值,高斯,中值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

onlywishes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值