python + opencv 第六节 图像的基本操作

# 1.获取并修改像素值
import cv2
import numpy as np

img = cv2.imread('salary.jpg')
# 获取坐标为 [100, 100]点的像素
px = img[100, 100] # 返回 [B, G, R]
print(type(px))
print(px)
blue = img[100, 100, 2]# 获取坐标为[100, 100]的 R(对应值为2)的值,(B对应0, G对应1)
print(type(blue))
print(blue)

#修改像素值
#img[100, 100] = [255, 255, 255] #一个点涂白
#img[100] = [255, 255, 255] #可以看到在图像上画了一条白线 水平方向
#img[:, 100] = [255, 255, 255] #可以看到在图像上花了一条白线,垂直方向  第一维(行)取全部,第二维(列)取 100 处
#img[:] = [255, 255, 255] #整个图像涂白
print(type(img))


#修改像素值方法2: 用到 Numpy 的 array.item
# print(type(img.item(10, 10, 2)))
# print(img[10, 10])
# print(img.item(10, 10, 0))
# img.itemset((10,10,2),100)
# print(img.item(10,10,2))

# 2.获取图像属性
# 行, 列, 通道, 图像数据类型等等
print(img.ndim) # 获取维度  输出 3
print(img.shape) #获取图像的高,宽,和通道数  输出 : (640, 1024, 3)
print(img.dtype) #获取图像数据类型  输出 : uint8

# 3.图像 ROI 感兴趣区域

# roi_1 = img[100:300, 500:550] # 选取感兴趣区域  100:300 是x轴200的距离,500:550是y轴50的距离
# img[300:500, 700:750] = roi_1 # 将ROI拷贝到另一区域,这里注意x轴和y轴的距离要保持一致才能拷贝

# 4. 为图像扩边
# def copyMakeBorder(src, top, bottom, left, right, borderType, dst=None, value=None)
# src : 源图
# top, bottom, left, right : 上下左右边界向外扩充边缘的大小
# borderType : 要添加哪种类型的边界
#         BORDER_REPLICATE  # 复制边界像素,重复最后一个元素  aaaaaa|abcdefgh|hhhhhhh
#         BORDER_REFLECT    # 镜像 fedcba|abcdefgh|hgfedcb
#         BORDER_REFLECT_101 # 对称法,以最边缘像素为轴,对称 gfedcb|abcdefgh|gfedcba 对称法和镜像法的差别就在最边缘的像素,对称法不镜像最边缘像素,镜像法包含最边缘的像素
#         BORDER_WRAP       # 将图像的左边拷贝到右边的边缘,右边拷贝到左边的边缘  cdefgh|abcdefgh|abcdefg
#         BORDER_CONSTANT   # 添加有颜色的常数值边界 需要使用参数value
# value 边界颜色,如果边界的类型是 cv2.BORDER_CONSTANT,则需要用到这个参数

# replicate_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_REPLICATE)
# cv2.namedWindow('replicate')
# cv2.imshow('replicate', replicate_)

# reflect_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_REFLECT)
# cv2.namedWindow('reflect')
# cv2.imshow('reflect', reflect_)

# wrap_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_WRAP)
# cv2.namedWindow('wrap')
# cv2.imshow('wrap', wrap_)

# constant_ = cv2.copyMakeBorder(img, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value = [255, 0, 0])
# cv2.namedWindow('constant_')
# cv2.imshow('constant_', constant_)

# 5. 图像混合 (可以产生透明的效果)
# def addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
# 按照公式 : dst = α · img1 + β · img2 + γ 混合
# α + β = 1
# gamma : 一个加到权重总和上的标量值,效果有点类似曝光度
# 注意 : 混合的两张图片,一定要大小一样

# img1 = cv2.imread('1024_663_fengyelu.jpg')
# img2 = cv2.imread('1024_663_lvshuiqingshan.jpg')
#
# dst = cv2.addWeighted(img1, 0.5, img2, 0.5, 200)
#
# cv2.namedWindow('混合后图像')
# cv2.imshow('混合后图像', dst)

# cv2.namedWindow('salary')
# cv2.imshow('salary', img)

logo1 = cv2.imread('opencv.jpg')
rows, cols, channel = logo1.shape
roi_logo = img[0:rows, 0:cols]

# def threshold(src, thresh, maxval, type, dst=None)
# 作用是将一幅灰度图二值化
# src : 源图像 要是灰度图
# thresh : 阈值
# maxval : 最大值 一般设置255
# type :
#         cv2.THRESH_BINARY:超过阈值的像素设置为maxVal,不超过的设置为0
#         cv2.THRESH_BINARY_INV:不超过阈值的设置为maxVal,超过的设置为0
#         cv2.THRESH_TOZERO:低于阈值的设置为0
#         cv2.THRESH_TOZERO_INV:低于阈值的设置为maxVal
#         cv2.THRESH_TRUNC:超过阈值的设置为maxval

# threshold函数有两个返回值,其中第二个返回值(这里是mask)是二值化后的灰度图。
# 当我们指定了阈值参数thresh,第一个返回值ret就是我们指定的thresh.换句话说,我们可以不指定阈值参数thresh。

logo2gray = cv2.cvtColor(logo1, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(logo2gray, 10, 255, cv2.THRESH_BINARY)
print(ret)
mask_inv = cv2.bitwise_not(mask)

img1_bg = cv2.bitwise_and(roi_logo, roi_logo, mask = mask_inv)

img2_bg = cv2.bitwise_and(logo1, logo1, mask = mask)

dst = cv2.add(img1_bg, img1_bg)
img[0:rows, 0:cols] = dst

cv2.imshow('res', img)


k = cv2.waitKey(0)
if k == 27:
    cv2.destroyAllWindows()

发布了80 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qiukapi/article/details/104500911