OpenCV图像处理基础_CodingPark编程公园

文章介绍

本文讲述如何使用Python + OpenCV完成对图像的基本处理

OpenCV图像处理基础

  1. OpenCV 安装
  2. 图像处理基础入门
  3. 像素处理
  4. 使用numpy访问像素
  5. 获取图像属性
  6. ROI感兴趣区域
  7. 通道拆分与合并

OpenCV 安装

• 1.安装Anaconda
• 2.下载opencv3
• 3.安装opencv3

安装Anaconda

https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

在这里插入图片描述

下载opencv3

 (1)  https://pypi.org/project/opencv-python/#files

 (2)  直接在Conda 环境下 pip install OpenCV  [这种方法省事儿 下载安装一键搞定]

在这里插入图片描述

安装opencv3

 (1)在“Anaconda Prompt”内使用语句:pip install 完整路径文件名	

  (2) 直接在Conda 环境下 pip install OpenCV  [这种方法省事儿 下载安装一键搞定]

在这里插入图片描述

验证安装结果

在这里插入图片描述

测试环境【读入图像+显示图像】

测试代码

# -*- coding: utf-8 -*-
import cv2
i=cv2.imread("E:\\lesson\\image\\test.png")
cv2.imshow("Demo",i)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("E:\\lesson\\image\\lesson1.png",i)


读入图像
i = cv2.imread(文件名,显示控制参数)
显示控制参数
cv.IMREAD_UNCHANGED
cv.IMREAD_GRAYSCALE
cv.IMREAD_COLOR

显示图像
cv2.imshow(窗口名,图像名)

cv2.waitKey(delay)
delay:
delay>0 等待delay毫秒
delay<0 等待键盘单击
delay=0 无限等待

cv2.destroyAllWindows() 删除所有窗口

保存图像
cv2.imwrite(文件地址,文件名)

显示结果
在这里插入图片描述

图像处理基础入门

二值图像

在这里插入图片描述

灰度图像

在这里插入图片描述

彩色图像

在这里插入图片描述
在这里插入图片描述

RGB转灰度

在这里插入图片描述

灰度转二值

在这里插入图片描述

使用OpenCV访问像素

读取像素

• 灰度图像,返回灰度值。
p=img[88,142]
print( p )

• BGR图像,返回值为B,G,R 的值。
分通道
blue=img[78,125,0]
print(blue)
green=img[78,125,1]
print(green)
red=img[78,125,2]
print(red)

全通道
p=img[78,125]
print§

修改像素

• 灰度图像
print(img[88,99]) //查看原有值
img[88,99]=255
print(img[88,99])

• BGR图像
分通道
print(img[88,99,0]) //查看原有值
print(img[88,99,1]) //查看原有值
print(img[88,99,2]) //查看原有值
img[88,99,0]=255
img[88,99,1]=255
img[88,99,2]=255
print(img[88,99,0])
print(img[88,99,1])
print(img[88,99,2])

全通道
print(img[88,99)
img[88,99]=[255,255,255]
print(img[88,99)

灰度图像-代码实现

读取+修改

# -*- coding: utf-8 -*-
import cv2
i=cv2.imread("image\\lena256.bmp",cv2.IMREAD_UNCHANGED)
#请确保当前目录下有灰度图像lena256.bmp
'''
print(i[100,100])
i[100,100]=255
print(i[100,100])
'''
p=i[100,100]
print(p)
i[100,100]=255
p=i[100,100]
print(p)


彩色图像-代码实现

读取+修改

# -*- coding: utf-8 -*-
import cv2
i=cv2.imread("e:\\lesson\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
# 请确保在指定目录下有彩色图像文件

# 更改一个通道
print(i[100,100])
i[100,100,0]=255
print(i[100,100])



'''
同时更改三个通道
print(i[100,100])
i[100,100]=[255,255,255]
print(i[100,100])
'''


'''
更改一个像素块
cv2.imshow("original",i)
i[100:150,100:150]=[0,0,255]
cv2.imshow("result",i)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''


使用numpy访问像素

读取像素

返回值=图像.item(位置参数)

•灰度图像,返回灰度值
p=img.item(88,142)
print( p )

• BGR图像,返回值为B,G,R 的值
blue=img.item(78,125,0)
green=img.item(78,125,1)
red=img.item(78,125,2)
print(blue)
print(green)
print(red)

修改像素

图像名.itemset(位置,新值)

• 灰度图像
print(img.item(88,99))
img.itemset((88,99),255)
print(img.item(88,99))

• BGR图像
print(img.item(88,99,0))
print(img.item(88,99,1))
print(img.item(88,99,2))
img.itemset((88,99,0),255)
img.itemset((88,99,1),255)
img.itemset((88,99,2),255)
print(img.item(88,99,0))
print(img.item(88,99,1))
print(img.item(88,99,2))

灰度图像-代码实现

读取+修改

import cv2
import numpy as np
i=cv2.imread("image\lena256.bmp",cv2.IMREAD_UNCHANGED)

print(i.item(100,100))
i.itemset((100,100),255)
print(i.item(100,100))


彩色图像-代码实现

读取+修改

import cv2
import numpy as np
i=cv2.imread("image\lenacolor.png",cv2.IMREAD_UNCHANGED)
'''
print(i.item(100,100,0))
i.itemset((100,100,0),255)
print(i.item(100,100,0))

print(i.item(100,100,1))
i.itemset((100,100,1),255)
print(i.item(100,100,1))
'''
print(i.item(100,100,2))
i.itemset((100,100,2),255)
print(i.item(100,100,2))


获取图像属性

• 1 形状:行、列、通道数
• 2 像素数目
• 3 图像的数据类型

形状

• shape 可以获取图像的形状,返回包含行数,列数,通道数的元组。
灰度 返回行数,列数
彩色 返回行数,列数,通道数
范例

import cv2
img1=cv2.imread(‘灰度图像’)
print(img1.shape)
=> (512,512)

import cv2
img2=cv2.imread(‘彩色图像’)
print(img2.shape)
=> (512,512, 3) //512行,512列, 3个通道

像素数目

• size 可以获取图像的像素数目。
灰度 返回:行数列数
彩色 返回:行数
列数*通道数

import cv2
img=cv2.imread(‘图像名’)
print(img.size)
=> 786432

图像类型

• dtype 返回的是图像的数据类型。

范例
import cv2
img=cv2.imread(‘图像名称’)
print(img.dtype)
=> uint8

图像属性-代码实现

import cv2
a=cv2.imread("image\lena256.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.imread("image\lenacolor.png",cv2.IMREAD_UNCHANGED)
print(a.shape)
print(b.shape)
print(a.size)
print(b.size)
print(a.dtype)
print(b.dtype)


ROI感兴趣区域

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

在这里插入图片描述

import cv2
import numpy as np

women = cv2.imread('./img/women.png')
girl = cv2.imread('./img/girl.bmp')
i = np.ones((1, 1, 3))			# 基底

i = women[220:400, 250:350]         # 看样子 i能被 瞬间撑大
print('i -> ', i)


'''

⚠️特别注意
有区域规定时 [180:360, 100:200] -> 则需要完全按规定区域大小办事

'''
# girl = i            # 二选一
girl[180:360, 100:200] = i      # 二选一



# cv2.imshow('women', women)
cv2.imshow('girl', girl)
cv2.waitKey(-1)             # 等待键盘单击
cv2.destroyAllWindows()




通道 拆分与合并

通道拆分

.split()

其实在【两种方法】访问像素时,我们已经做过逐个通道的研究了
这里算是提供一种新的 拆分 合并 手法

OpenCV中我们曾用过
• import cv2
• img=cv2.imread(‘图像名’)
• b = img[ : , : , 0 ]
• g = img[ : , : , 1 ]
• r = img[ : , : , 2 ]

如今
• import cv2
• img=cv2.imread(‘图像名’)
• b , g , r = cv2.split(img)

在这里插入图片描述
在这里插入图片描述

通道合并

.merge()

⚠️通道顺序 要注意

拆分-代码实现

import cv2
women = cv2.imread('img/women.png')
b, g, r = cv2.split(women)

cv2.imshow('org', women)
cv2.imshow('B', b)
cv2.imshow('G', g)
cv2.imshow('R', r)

cv2.waitKey(0)
cv2.destroyAllWindows()



合并-代码实现

import cv2
import numpy as np
a=cv2.imread("image\lenacolor.png")
b,g,r=cv2.split(a)
bgr=cv2.merge([b,g,r])
cv2.imshow("bgr",bgr)
cv2.waitKey()
cv2.destroyAllWindows()


'''
蓝色与0 0合并

下标法
b = split(a)[0]
'''

import cv2
import numpy as np
a=cv2.imread("image\lenacolor.png")
rows,cols,chn=a.shape
b=cv2.split(a)[0]
g = np.zeros((rows,cols),dtype=a.dtype)  
r = np.zeros((rows,cols),dtype=a.dtype)  
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38411989/article/details/106661901