opencv(5)opencv图像基本操作

OpenCV图像的基本操作

访问与修改像素值

import numpy as np
import cv2 as cv
img = cv.imread('D:\\Codelearn\\python\\opencv\\image\\timg.jpg')

# 访问像素
# px = img[100, 100]
# print(px)

for x in range(10, 100):
    for y in range(10, 100):
        img[x, y] = [255, 0, 0]

cv.namedWindow('image', cv.WINDOW_NORMAL)
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()

属性访问

print(img.size)    # 大小
print(img.shape)   # 形状
print(img.dtype)   # 图像数据类型

结果
2359296
(768, 1024, 3) //后面这个3 表示为图像的通道数 
uint8
img[:, :, 2] = 0  # 所有红色通道的设置为0
img[:, :, 1] = 0  # 所有绿色通道的设置为0
img[:, :, 0] = 0  # 所有蓝色通道的设置为0

图像融合

img1 = cv.imread('D:\\code\\Python_Code\\opencv\\image\\5.jpg')
img2 = cv.imread('D:\\code\\Python_Code\\opencv\\image\\9.jpg')
dst = cv.addWeighted(img1, 0.1, img2, 0.9, 0)
cv.imwrite("'D:\\code\\Python_Code\\opencv\\image\\merge.jpg'",dst)
cv.imshow('dst', dst)
cv.waitKey(0)
cv.destroyAllWindows()
# 问题思考:运动图片的模糊化修补,可以通过图片本身的微量旋转的区域叠加,到达效果呢??

在这里插入图片描述

import numpy as np
import cv2 as cv

# 加载两张图片
img1 = cv.imread('D:\\code\\Python_Code\\opencv\\image\\2.jpg')
img2 = cv.imread('D:\\code\\Python_Code\\opencv\\image\\10.jpg')

# 我想把logo放在左上角,所以我创建了ROI
rows, cols, channels = img2.shape  # 原因 行数5
roi = img1[0:rows, 0:cols]

# 现在创建logo的掩码,并同时创建其相反掩码
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)

# 现在将ROI中logo的区域涂黑
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
# 仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(img2, img2, mask=mask)

# 将logo放入ROI并修改主图像
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv.imshow('res', img1)
cv.waitKey(0)
cv.destroyAllWindows()

报错: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function ‘cv::binary_op’

原因是我任意下载了两张图,之前10.jpg的图比本身的2.jpg的图都还大,在第5行代码中分别取到了img2的大小.在第10行代码去涂黑的时候就超界了,到最后的融合可能会超界,所以将10.jpg换成一张小图就可以了。(看了很多网上的帖子,都说是通道的问题,但是我这边一张同样通道的图,修改到超大小,就会报错。) 原理为什么,后面再考据一下。

rows, cols, channels = img2.shape  # 原因 行数5
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv) #行数10

在搜索过程中发现一个和上面差不多的报错,再次也记录下来

(-215:Assertion failed) src.type() == CV_8UC1 in function ‘cv::adaptiveThreshold’:
这个报错的原因:错误是告诉您的图像不是8位灰度图像。
把图像改为彩色图
gray= cv.cvtColor(src, cv.COLOR_BGR2GRAY)

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读