Python+OpenCV图像处理(第2课---图像处理基础)

基础知识

在这里插入图片描述
图像是由像素构成的,二值图像非0(黑)即1(白),灰度图像(0-255),RGB图像三通道都是0-255(OpenCV中某像素顺序是BGR)。

像素读取及修改

灰度图

import cv2

img = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
print(img[100, 100])    # 73(第100行,第100列像素值)
img[100, 100] = 255
print(img[100, 100])    # 255

RGB图

# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
cv2.imshow("original", img)
print(img[100, 100])    # [ 78  68 178](BGR三通道。第100行,第100列像素值)

img[100, 100, 0] = 255  # 修改0通道(B通道)
print(img[100, 100])    # [255  68 178]

img[100, 100, 1] = 255  # 修改1通道(G通道)
print(img[100, 100])    # [255 255 178]

img[100, 100, 2] = 255  # 修改2通道(R通道)
print(img[100, 100])    # [255 255 255]

img[100:150, 100:150] = [255, 255, 255]
cv2.imshow("result1", img)

img[100:150, 100:150] = [0, 0, 255]
cv2.imshow("result2", img)

cv2.waitKey(0)
cv2.destroyAllWindows()


在这里插入图片描述

numpy像素读取及修改

# -*- coding: utf-8 -*-

import cv2

# 灰度图
img1 = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
print(img1.item(100, 100))      # 73
img1.itemset((100, 100), 255)
print(img1.item(100, 100))      # 255

# RGB图
img2 = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
print(img2.item(100, 100, 0))   # 78
img2.itemset((100, 100, 0), 255)
print(img2.item(100, 100, 0))   # 255

获取图像属性

# -*- coding: utf-8 -*-

import cv2

img1 = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
img2 = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)

print(img1.shape)       # (256, 256) 灰度图,行数和列数
print(img2.shape)       # (512, 512, 3) RGB图, 行数和列数和通道数

print(img1.size)        # 65536 像素数(灰度图,行数*列数)
print(img2.size)        # 786432 像素数(RGB图,行数*列数*通道数)

print(img1.dtype)       # uint8
print(img2.dtype)       # uint8

图像ROI(region of interest)

# -*- coding: utf-8 -*-

import cv2
import numpy as np


img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)

face = np.ones((101, 101, 3))     # 101行,101列,3通道的图像
face = img[220:400, 250:350]    # 取lenacolor.png的这块区域放在这个图像的左上方

img[0:180, 0:100] = face

cv2.imshow("Demo", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

通道的拆分和合并

# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)

b, g, r = cv2.split(img)        # 拆分成三通道
cv2.imshow("original", img)
cv2.imshow("B", b)
cv2.imshow("G", g)
cv2.imshow("R", r)

merge = cv2.merge([b, g, r])    # 合并三通道,注意顺序b,g,r

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

在这里插入图片描述

# -*- coding: utf-8 -*-

import cv2
import numpy as np

img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
row, col, channel = img.shape
b = cv2.split(img)[0]               # B通道
g = np.zeros([row, col], img.dtype) # G通道全0
r = np.zeros([row, col], img.dtype) # R通道全0

merge = cv2.merge([b, g, r])  # 合并三通道

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

在这里插入图片描述

图像加法

前提:参与运算的图像大小、类型必须一致。

# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)

add1 = img + img         # 像素值之和大于255就模255
add2 = cv2.add(img, img) # 像素值之和大于255就是255

cv2.imshow("original", img)
cv2.imshow("add1", add1)
cv2.imshow("add2", add2)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

图像融合

结果图像=图像1系数1+图像2系数2+亮度调节量

# -*- coding: utf-8 -*-

import cv2

img1 = cv2.imread("C:\\imgs\\add\\lena.bmp", cv2.IMREAD_UNCHANGED)
img2 = cv2.imread("C:\\imgs\\add\\boat.bmp", cv2.IMREAD_UNCHANGED)

result = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

图像类型转换

cvtColor()

# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)

result = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

cv2.imshow("img", img)
cv2.imshow("result", result)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

图像缩放

resize()

# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)

result1 = cv2.resize(img, (300, 100))       # 顺序:列、行

row, col, channel = img.shape
result2 = cv2.resize(img, (round(col*0.5), round(row*1.1)))     # 注意列行顺序

# 水平方向扩大为1.1倍,垂直方向缩小为0.5倍
result3 = cv2.resize(img, None, fx=1.1, fy=0.5) 

cv2.imshow("img", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.imshow("result3", result3)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

图像反转

flip()

# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)

res1 = cv2.flip(img, -1)    # flipCode < 0
res2 = cv2.flip(img, 0)     # flipCode = 0
res3 = cv2.flip(img, 1)     # flipCode > 0

cv2.imshow("img", img)
cv2.imshow("res1", res1)
cv2.imshow("res2", res2)
cv2.imshow("res3", res3)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

阈值分割

enum cv::ThresholdTypes

在这里插入图片描述
在这里插入图片描述
threshold()
在这里插入图片描述

# -*- coding: utf-8 -*-

import cv2

img = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)

retval1, res1 = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY) # retval1=128
retval2, res2 = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY_INV)
retval3, res3 = cv2.threshold(img, 128, 255, cv2.THRESH_TRUNC)
retval4, res4 = cv2.threshold(img, 128, 255, cv2.THRESH_TOZERO)
retval5, res5 = cv2.threshold(img, 128, 255, cv2.THRESH_TOZERO_INV)

cv2.imshow("img", img)
cv2.imshow("res1", res1)
cv2.imshow("res2", res2)
cv2.imshow("res3", res3)
cv2.imshow("res4", res4)
cv2.imshow("res5", res5)

cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

特别说明

本文参考网易云课堂《Python+OpenCV图像处理》

发布了323 篇原创文章 · 获赞 193 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/103804319