Opencv——图像的处理

灰度图像输出:

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

img=cv2.imread('miku.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img_gray.shape

cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)    
cv2.destroyAllWindows() 

图片输出:

 将BGR格式图片转换为HSV格式,其中:

HSV

  • H - 色调(主波长)。
  • S - 饱和度(纯度/颜色的阴影)。
  • V值(强度)
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

cv2.imshow("hsv", hsv)
cv2.waitKey(0)    
cv2.destroyAllWindows()

图片输出:

 图像阈值:

我们知道每个图片都由大量不同的像素点组成,像素点亮度范围0-255,阈值操作就是对符合范围的像素的阈值进行一个规定,比如所有高于127的统一设置为255,这样就是一个高亮的功能,_INV则是反向操作。

ret, dst = cv2.threshold(src, thresh, maxval, type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图

  • dst: 输出图

  • thresh: 阈值

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

  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

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

  • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

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

  • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

  • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 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()

图片输出:

由图可以看出,黑白对比度比较高,而_INV则是反向操作。

图像平滑处理 :

某些图片可能会出现一些噪音点,这时候我们需要通过滤波平滑处理处理噪音点。

 均值滤波:

# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))

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

效果:

方框滤波:本质上其实和均值差不多,当进行归一化操作后就是均值滤波,注意,不进行归一化操作下,有可能会溢出,曝光        

# 方框滤波
# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)  

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

# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  

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

效果:图一归一化与均值几乎无差别,图二大量像素越界。

 高斯滤波:

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)  

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

效果:

中值滤波:用中值代替,相当于直接忽略噪音点,效果最好

# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波

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

 效果:

 

所有滤波的效果对比:

 

滤波操作需要卷积知识,详细知识点请点击:

### OpenCV 中的图像掩码操作 #### 创建掩码 为了执行有效的图像掩码操作,创建合适的掩码至关重要。通常情况下,掩码是一个灰度图(即单通道),其中白色区域代表要保留的部分,黑色部分则被忽略。 ```python import numpy as np import cv2 # 假设有一个彩色图片 img 和一个形状相同的全黑背景上的圆形白区作为 mask img = cv2.imread('image.jpg') mask = np.zeros(img.shape[:2], dtype=np.uint8) # 绘制圆圈在 mask 上 (中心坐标, 半径, 颜色(255), 线条粗细(-1 表示填充)) cv2.circle(mask, (center_x, center_y), radius, 255, -1) ``` #### 应用掩码于图像上 当有了适当构建好的掩码之后,可以利用 `bitwise_and` 函数来应用这个掩码到原始图像上去。这会使得只有那些对应位置为白色的像素得以保存下来;而其他地方将会变成完全透明或黑色取决于具体应用场景[^1]。 ```python masked_img = cv2.bitwise_and(img, img, mask=mask) ``` 对于某些特定需求来说,可能还需要计算带有掩码条件下的统计特征比如平均亮度等: ```python mean_val_inside_mask = cv2.mean(img, mask)[0] print(f"The mean intensity inside the masked area is {mean_val_inside_mask}") ``` 这里使用了 `cv2.mean()` 方法并传入了一个额外参数 `mask` 来指定只对感兴趣区域内做均值运算[^2]。 另外,在处理不同类型的逻辑运算时也可以通过类似的接口实现,例如取反操作可以通过如下方式完成: ```python inverted_masked_img = cv2.bitwise_not(masked_img) ``` 值得注意的是,如果尝试在一个多通道图像与另一个具有相同尺寸但是仅含单一颜色平面的数据结构之间直接相乘,则可能会遇到错误提示因为它们并不兼容。因此务必确保参与运算的对象都处于同一维度下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值