关闭

【OpenCv-Python】六、Basic Operations on Images

36人阅读 评论(0) 收藏 举报
分类:

图像的基础操作

目标

学会:

  • 获取像素值并修改
  • 获取图像的属性
  • 设置图像区域(ROI)
  • 图像通道的拆分及合并

几乎所有的这些操作与 Numpy 的关系都比与 OpenCv 的关系更加紧密,因此熟练使用 Numpy 可以帮助我们写出更好的代码。
(示例将会在Python终端中展示,因为它们大部分只有一行代码。)

6.1 获取并修改像素值

首先让我们读入一副图像:

import cv2
import numpy as np

img = cv2.imread('love.jpg')

您可以通过它的行和列坐标获取一个像素值。对于BGR图像,它返回一个蓝色、绿色、红色值的数组。对于灰度图像,只返回相应的强度。

px = img[100,100]
print(px)

#只获取蓝色像素
blue = img[100,100,0]
#只获取红色像素值
#red = img[100,100,1]
print(blue)

你可以用同样的方法修改像素值。

img[100,100] = [255,255,255]
print(img[100,100])

警告

Numpy是一个用于快速数组计算的优化库。因此,简单地访问每个像素值并修改它将非常缓慢,如果可以使用Numpy不建议去循环修改。

注意

上面提到的方法通常用于选择数组的区域,比如前5行和最后3列。对于单个像素访问,Numpy数组方法、array.item()和array.itemset()被认为是更好的。但它总是返回一个标量。因此,如果您想访问所有的B、G、R值,则需要分别调用array.item()。 获取像素值及修改更好的方法:
img.item(10,10,2)
#修改之后
img.itemset((10,10,2),112)
img.item(10,10,2)

6.2 获取图像属性

图像的属性包括:行,列,通道,图像数据类型,像素数目等
img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数, 通道数的元组。
print (img.shape)

注意

如果图像是灰度图,返回值仅有行数和列数。所以通过检查这个返回值 就可以知道加载的是灰度图还是彩色图。

像素的数目可以通过 img.size 来获取:

print(img.size)

图像的数据类型可以通过img.dtype来获取:

print(img.dtype)

注意

在调试(debug)时 img.dtype 非常重要。因为在 OpenCV- Python 代码中经常出现数据类型的不一致。

6.3 图像 ROI

有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中 眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是 直接在一幅图像中搜索。这样会提高程序的准确性和性能。
ROI 也是使用 Numpy 索引来获得的。现在我们选择球的部分并把他拷贝到图像的其他区域。

ball = img[20:310,830:1080] #(纵坐标切片,横坐标切片)
img[60:350,520:770] = ball
cv2.imshow('image',img)
cv2.waitKey(0)           #如果没有这行代码,图像窗口则会无响应
cv2.destroyAllWindows()

6.4 拆分及合并图像通道

有时我们需要对 BGR 三个通道分别进行操作。这是你就需要把 BGR 拆 分成单个通道。有时你需要把独立通道的图片合并成一个 BGR 图像。你可以 这样做:

b,g,r = cv2.split(img)
img = cv2.merge9(b,g,r)

或者:

b = img[:,:,0]

假如你想使所有像素的红色通道值都为 0,你不必先拆分再赋值。你可以 直接使用 Numpy 索引,这会更快

img[:,:,2] = 0

警告

cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用 Numpy 索引就尽量用。

6.5 为图像扩充

如果你想在图像周围创建一个边,就像相框一样,你可以使用 cv2.copyMakeBorder()
函数。这经常在卷积运算或 0 填充时被用到。这个函数包括如下参数:

  • src 输入图像
  • top, bottom, left, right 对应边界的像素数目
  • borderType 要添加那种类型的边界,类型如下:
    1. cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要 下一个参数(value)。
    2. cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcde- fgh|hgfedcb
    3. cv2.BORDER_REFLECT_101orcv2.BORDER_DEFAULT 跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
    4. cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh
    5. cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh| abcdefgh|abcdefg
  • value 边界颜色,如果边界的类型是 cv2.BORDER_CONSTANT

为了更好的理解这几种类型请看下面的演示程序。

import cv2
import numpy as np
from matplotlib import pyplot as plt

BLUE = [255,0,0]

img1 = cv2.imread('opencv-logo.png')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()
0
0
查看评论

【OpenCv-Python】七、Arithmetic Operations on Images

图像上的算数运算 目标 学习图像上的算术 算 加法 减法 位 算等。 我们将 学习的函数有 cv2.add() cv2.addWeighted() 等。 7.1 图像加法 你可以使用OpenCv中的函数 cv2.add() 将两幅图像进行加法运算,当然也可以直接...
  • vcx08
  • vcx08
  • 2018-01-16 14:01
  • 38

Operations with images

Input/Output Images Load an image from a file: Mat img = imread(filename) If you read a jpg file, a 3 channel image is created by...
  • lcj_cjfykx
  • lcj_cjfykx
  • 2013-06-05 12:57
  • 641

【OpenCv-Python】一、Getting Started with Images

1.1读入图像 使用函数 cv2.imread() 读入图像。这幅图像应该在此程序的工作路径,或者给函数提供一个完整的路径,第二个参数是要告诉函数应该如何读取这幅图片。 cv2.IMREAD_COLOR:读取一副彩色图像。图像的透明度会被忽略,这是默认参数。 cv2.IMREAD...
  • vcx08
  • vcx08
  • 2018-01-07 13:34
  • 77

OpenCV-Python 教程——从Images开始

目标 这里,你将会学到如何读取、显示、保存一张图片 你将会学习这些函数:cv2.imread(), cv2.imshow(), cv2.imwrite() 当然,你将会学习如何用Matplotlib显示这些图片 使用OpenCV读取图片利用函数cv2.imread()来读取一张图片。该图片应该在工作...
  • u013180339
  • u013180339
  • 2017-08-27 08:26
  • 126

Blending of images, raster operations and basic color adjustments with GDI+

http://www.codeproject.com/cs/media/KVImageProcess.aspBlending of images, raster operations and basic color adjustments with GDI+By Konstantin Vasserm...
  • metababy
  • metababy
  • 2006-01-14 15:15
  • 898

数据库——SQL server2008安装与visual basic连接

这是自己当时初始CSDN上写的第一篇博客,其中当时的心情依然记忆尤新,总之美美的。
  • u013030601
  • u013030601
  • 2014-06-29 11:32
  • 1518

Basic operations with opencv 3.0

opencv随着这几年的发展已经变得越来越流行,特别是在去年推出了3.0版本以后,出现很多新技术,也摒弃了原有的一些采用C语言来定义的结构,比如大家熟知的IplImage, cvMat等图像结构。采用了C++来编写的opencv,提供给我们更加便利的操作,也使得我们只要关注算法本身的内容,不必太过纠...
  • yuyongfang6688
  • yuyongfang6688
  • 2015-05-28 09:06
  • 117

3.7.3 - Basic String Operations

  • seamanj
  • seamanj
  • 2015-11-18 01:59
  • 379

VIM basic operations

1) modes: mode key description General Mode   Insert Mode i begin at current cursor place   a begin at the ...
  • TheMinority
  • TheMinority
  • 2012-06-04 00:29
  • 337

basic file operations

// basic file operations #include #include using namespace std; int main () {   ofstream myfile;   myfile.open ("example.tx...
  • qinuay
  • qinuay
  • 2016-05-17 22:47
  • 53
    个人资料
    • 访问:126504次
    • 积分:3214
    • 等级:
    • 排名:第12600名
    • 原创:187篇
    • 转载:4篇
    • 译文:9篇
    • 评论:33条
    RUNNING|~_~|My web
    微信公众号
    课程设计、视频资源、有料趣文
    Worldhello


    微信公众号:Worldhello
    期待您的关注!
    博客专栏
    最新评论