学习opencv-python记录2图像的基操

本文详细介绍使用OpenCV进行图像处理的基本操作,包括像素值的获取与修改、图像属性的获取、图像ROI处理、图像扩边、图像算术运算及按位运算等内容,并通过实例演示了如何利用阈值处理实现图像的抠图效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的学习中一直都没怎么搞清楚灰度值和通道的概念,刚才偶然找到了一篇:https://blog.youkuaiyun.com/silence2015/article/details/53789748

获取并修改像素值

img = cv2.imread('IMG3.jpg')
px = img[100, 100] # 获取某个点的像素值
print(px)
blue = img[100,100,0]  # image[i,j,c],i表示图片的行数,j表示图片的列数,c表示图片的通道数(0代表B,1代表G,2代表R,一共是RGB三通道)。坐标是从左上角开始
print(blue)
img[100,100]=[255,255,255] # 改变像素值
print(img[100,100])

输出结果为:

[170 116 193]
170
[255 255 255]

对于获取每一个像素值,也许使用 Numpy 的 array.item() 和 array.itemset() 会更好。但是返回值是标量。如果你想获得所有 B,G,R 的值,你需要使用 array.item() 分割他们。获取像素值及修改的更好方法:

img = cv2.imread('IMG3.jpg')
print(img.item(100, 100, 2))
img.itemset((100, 100, 2), 100) #更改
print(img.item(100, 100, 2))

输出:

193
100

获取图像属性

图像的属性包括:行,列,通道,图像数据类型,像素数目等img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数,通道数的元组。

print(img.shape)

注意:如果图像是灰度图,返回值仅有行数和列数。所以通过检查这个返回值就可以知道加载的是灰度图还是彩色图。
img.size 可以返回图像的像素数目,dtype返回的是图像的数据类型:

print(img.size, img.dtype)

图像ROI (region of interest,感兴趣区域)

img=cv2.imread('messi5.jpg')
ball=img[280:340,330:390]
img[273:333,100:160]=ball
img=cv2.imshow('test', img)

图像扩边

如果你想在图像周围创建一个边,就像相框一样,你可以使用 cv2.copyMakeBorder()函数。这经常在卷积运算或 0 填充时被用到.

由于是使用 matplotlib 绘制,OpenCV 中是按 BGR,matplotlib 中是按 RGB 排列,所以交换 R 和 B 的位置:img1 = img[:,:,[2,1,0]]

import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE = [255,0,0]
img = cv2.imread('IMG3.jpg')
replicate = cv2.copyMakeBorder(img, 40, 40, 40, 40, cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, 40,40, 40, 40, cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, 40,40,40,40,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img, 40,40,40,40, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, 40,40,40,40, cv2.BORDER_CONSTANT,value=BLUE)
img1 = img[:,:,[2,1,0]]
replicate1 = replicate[:,:,[2,1,0]]
reflect1 = reflect[:,:,[2,1,0]]
reflect1011 = reflect101[:,:,[2,1,0]]
wrap1 = wrap[:,:,[2,1,0]]
constant1 = constant[:,:,[2,1,0]]
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate1,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect1,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect1011,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap1,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant1,'gray'),plt.title('CONSTANT')
plt.show()

图像上的算术运算

按位运算

img1 = cv2.imread('IMG3.jpg')
img2 = cv2.imread('logo.jpeg')

rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',img2gray)
ret, mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY) # 第二个阈值的具体值进行不同的更改所得图像结果也不同,具体应怎么取值我在网上还未搜到,先留个坑。
mask_inv = cv2.bitwise_not(mask)
cv2.imshow('mask',mask)
cv2.imshow('mask_inv',mask_inv)
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
cv2.imshow('img1_bg',img1_bg)
cv2.imshow('img2_fg',img2_fg)
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('dst', dst)
cv2.imshow('res', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

灰度图由0~255表示,0为黑,255为白,从位操作的角度出发,纯黑色为0,不是纯黑色为1,所以在一些纯白色,或者纯黑色背景里,可以转为灰度图,利用阈值将非背景色的内容抠出来作为模板,再与原图做位操作,进行抠图。

(1)Cv2.bitwise_not(图片文件),将图片里像素值按位反向。

(2)Cv2.bitwise_and (目标文件,源文件,mask),将图片里的像素值按位与.

(3)Cv2.add(目标文件,源文件),将图片里的像素值按位加

(4)Cv2.bitwise_xor (目标文件,源文件,mask),将图片里的像素值按位异或
使用bitwise_and时,取较小的值(1 AND 0=0).使用bitwise_or时,取较大的值(1 OR 0=1).

阈值:

cv2.threshold(): 当像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。返回值有两个。

第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进行分类的阈值。第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。OpenCV提供了多种不同的阈值方法,这是有第四个参数来决定的。这些方法包括:
  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

在上面的代码中已经展示的很清楚。

自适应阈值:

cv2.adaptiveThreshold(): 当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。
这种方法需要我们指定三个参数,返回值只有一个。
  • Adaptive Method- 指定计算阈值的方法。
  – cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
  – cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
  • Block Size - 邻域大小(用来计算阈值的区域大小)。
  • C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。

mask = cv2.adaptiveThreshold(img2gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值