访问和修改像素值

import cv2 as cv
img=cv.imread('./images/lena.jpeg')
# 显示某个像素的数据,如果是BGR图像,则返回一个由蓝色、绿色和红色值组成的数组;
# 对于灰度图像,只返回相应的灰度
px=img[100,100]
print(px) # [ 85  47 131]
# 仅访问蓝色像素
blue=img[100,100,0]
print(blue) # 85
# 修改像素值
img[100,100]=[255,255,255]
print(img[100,100]) # [255 255 255]
# 对于单个像素访问,Numpy方法array.item()和array.itemset()被认为更好,
# 但是它们始终返回标量。如果要访问所有B,G,R,则需要分别调用所有的array.item()。
# 访问red值
red=img.item(100,100,2)
print(red) # 255
# 修改red值
img.itemset((100,100,2),100)
print(img.item(100,100,2)) # 100

访问图像属性

图像属性包括行数、列数和通道数,图像数据类型,像素数等。

import cv2 as cv
img=cv.imread('./images/lena.jpeg')
shape=img.shape # 行数、列数和通道数
size=img.size # 像素数
dtype=img.dtype # 图像数据类型
print("shape:{0},size:{1},dtype:{2}".format(shape,size,dtype))

图像感兴趣区域ROI

使用Numpy索引再次获得ROI

import cv2 as cv

img=cv.imread('./images/lena.jpeg')
print(img.shape)
region=img[100:180,80:100]
img[50:130,30:50]=region  # 选择感兴趣的区域并复制到图像中的另一个区域
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

拆分和合并图像通道

需要分别处理图像的B,G,R通道。这时将BGR图像拆分为单个通道。

cv.split()方法拆分,cv.merge()方法合并

import cv2 as cv

img=cv.imread('./images/lena.jpeg')
# 使用cv.split()方法拆分
# b,g,r=cv.split(img)
# print(b)
# print(g)
# print(r)

# 使用numpy索引访问
b=img[:,:,0]
g=img[:,:,1]
r=img[:,:,2]
img1=cv.merge((b,g,r))
cv.imshow('img',img1)
cv.waitKey(0)
cv.destroyAllWindows()

cv.split()是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则使用Numpy索引访问。

为图像设置边框(填充)

cv.copyMakeBorder()在图像周围创建边框(如相框)。

cv.copyMakeBorder(src,top,bottom,left,right,borderType,dst,value)
  • src:输入图像
  • top,bottom,left,right边界宽度(以相应方向上的像素数为单位)
  • borderType:定义要添加哪种边框的标志。
    • cv.BORDER_CONSTANT:添加恒定的彩色边框。该值应作为下一个参数给出。
    • cv.BORDER_REFLECT:边框将是边框元素的镜像。如:fedcba|abcdefgh|hgfedcb
    • cv.BORDER_REFLECT_101或cv.BORDER_DEFAULT与上述相似,如:gfedcb|abcdefgh|gfedcba
    • cv.BORDER_REPLICATE:最后一个元素被复制。如:aaaaaa|abcdefgh|hhhhhh
    • cv.BORDER_WRAP:cdefgh|abcdefgh|abcdefg
  • value:边框的颜色,边框类型为cv.BORDER_CONSTANT
import cv2 as cv
from matplotlib import pyplot as plt

img=cv.imread('./images/opencv.png')
img=img[:,:,[2,1,0]]
blue=[255,0,0]
# aaaaaa | abcdefgh | hhhhhhh
img1=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_REPLICATE)
# fedcba | abcdefgh | hgfedcb
img2=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_REFLECT)
# gfedcb | abcdefgh | gfedcba
img3=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_REFLECT_101)
# cdefgh | abcdefgh | abcdefg
img4=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_WRAP)
# 常量值 value
img5=cv.copyMakeBorder(img,30,30,30,30,cv.BORDER_CONSTANT,value=blue)
plt.subplot(2,3,1)
plt.imshow(img)
plt.title('Original')
plt.xticks([])
plt.yticks([])
plt.subplot(2,3,2)
plt.imshow(img1)
plt.title('Replicate')
plt.xticks([])
plt.yticks([])
plt.subplot(2,3,3)
plt.imshow(img2)
plt.title('Relect')
plt.xticks([])
plt.yticks([])
plt.subplot(2,3,4)
plt.imshow(img3)
plt.title('Reflect_101')
plt.xticks([])
plt.yticks([])
plt.subplot(2,3,5)
plt.imshow(img4)
plt.title('Wrap')
plt.xticks([])
plt.yticks([])
plt.subplot(2,3,6)
plt.imshow(img5)
plt.title('Constant')
plt.xticks([])
plt.yticks([])
plt.show()

结果如下:

 

 

 posted on 2024-05-01 22:34  会飞的金鱼  阅读(14)  评论(0)    收藏  举报