Python OpenCV像素操作

Python OpenCV像素操作

环境声明 : Python3.6 + OpenCV3.3 + PyCharm IDE

首先要引入OpenCV和Numpy支持,添加代码如下:

import cv2 as cv;
import numpy as np;

读写像素

对RGB图像来说,在Python中第一个维度表示高度、第二个维度表示宽度、第三个维度是通道数目,可以通过下面的代码获取图像三个维度的大小

print(image.shape)
print(image.size)
print(image.dtype)

循环读取图像方法一:

直接从图像中读取,缺点是每次都需要访问imread之后的Mat对象,进行native操作,速度是个问题, 代码实现如下:

height = image.shape[0]

width = image.shape[1]

channels = image.shape[2]

print(image.shape)

for row in range(height):

    for col in range(width):

        for c in range(channels):

            level = image[row, col, c]

            pv = level + 30

            image[row, col, c] = (255 if pv>255 else pv)

循环读取图像方法二:

首先通过Numpy把像素数据读到内存中,在内存中进行高效循环访问每个像素,修改之后,在赋值回去即可,代码如下:

# read once

pixel_data = np.array(image, dtype = np.uint8);

# loop pixel by pixel

for row in range(height):

    for col in range(width):

        for c in range(channels):

            level = pixel_data[row, col, c]

            pixel_data[row, col, c] = 255 - level

# write once

image[ : : ] = pixel_data

案例演示 在Python语言中完成图像的属性读取、像素读取与操作、实现了图像的颜色取反、亮度提升、灰度化、梯度化、操作。首先看一下效果:

完整的Python代码实现如下:

import cv2 as cv;

import numpy as np;



def inverse(image):

    print("read and write pixel by pixel")

    print(image.shape)

    print(image.size)

    print(image.dtype)

    height = image.shape[0]

    width = image.shape[1]

    channels = image.shape[2]

    # read once

    pixel_data = np.array(image, dtype = np.uint8);

    # loop pixel by pixel

    for row in range(height):

        for col in range(width):

            for c in range(channels):

                level = pixel_data[row, col, c]

                pixel_data[row, col, c] = 255 - level

    # write once

    image[ : : ] = pixel_data

    cv.imshow("inverse image", image)



def brightness(image):

    print("read and write pixel by pixel")

    height = image.shape[0]

    width = image.shape[1]

    channels = image.shape[2]

    print(image.shape)

    for row in range(height):

        for col in range(width):

            for c in range(channels):

                level = image[row, col, c]

                pv = level + 30

                image[row, col, c] = (255 if pv>255 else pv)

    cv.imshow("inverse image", image);



def to_gray(image):

    print("RGB to Gray Image")

    height = image.shape[0]

    width = image.shape[1]

    channels = image.shape[2]

    print("channels : ", channels);

    print(image.shape)

    for row in range(height):

        for col in range(width):

            blue = image[row, col, 0]

            green = image[row, col, 1];

            red = image[row, col, 2]

            gray = (0.2989*red + 0.5870*green + 0.1140*blue);

            image[row, col, 0] = gray;

            image[row, col, 1] = gray;

            image[row, col, 2] = gray;

    cv.imshow("gray image", image)



def gradient_image(image):

    gx = cv.Sobel(image, cv.CV_32F, 1, 0)

    gy = cv.Sobel(image, cv.CV_32F, 0, 1)

    dst = cv.addWeighted(gx, 0.5, gy, 0.5, 50)

    sobel_abs = np.absolute(dst)

    sobel_8u = np.uint8(sobel_abs)

    cv.imshow("gradient image", sobel_8u)



def clam(pv):

    if pv > 255:

        return 255

    if pv < 0:

        return 0;

    return pv;



print("Image Pixel Operation Demo")

src = cv.imread("D:/vcprojects/images/demo.png")

cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)

cv.imshow("input image", src)

gradient_image(src)

cv.waitKey(0)

cv.destroyAllWindows()

原文发布于微信公众号 - OpenCV学堂(CVSCHOOL)

原文发表时间:2017-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jack-Cui

Caffe学习笔记(四):使用pycaffe生成train.prototxt、test.prototxt文件

Python版本: Python2.7 运行平台: Ubuntu14.04 一、前言     了解到上一篇笔记的内容,就可以尝试自己编写python程序生...

1.3K60
来自专栏IT派

【深度学习入门系列】TensorFlow训练线性回归

作者:董超 来源:腾讯云技术社区「腾云阁」 上一篇文章我们介绍了 MxNet 的安装,但 MxNet 有个缺点,那就是文档不太全,用起来可能是要看源代码才能理...

34030
来自专栏AI派

Numpy 修炼之道 (9)—— 广播机制

我们都知道,Numpy中的基本运算(加、减、乘、除、求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下。

33230
来自专栏小鹏的专栏

opencv实现抠图(单一背景),替换背景图

下面简单图片演示一下: 提取mask: ? ===> ? 替换背景: ?  +  ? = ? python的opencv代码如下: # coding=utf-8...

1.6K100
来自专栏简书专栏

基于tensorflow的MNIST数据集手写数字分类预测

MNIST是Mixed National Institue of Standards and Technology database的简称,中文叫做美国国家标准...

21830
来自专栏AIUAI

Caffe2 - (三十三) Detectron 之 roi_data - data loader

42840
来自专栏mathor

matlab—影像分析基础

其实一张图片有rgb三种颜色,每个点就是一个矩阵的数值,而这个数值就代表着rgb,所以我们操作以一个图片,也就相当于操作一个矩阵内的数值,或者说,修改矩阵内的数...

13020
来自专栏Java开发者杂谈

一个有趣的问题

前言   这个问题来自于看到的一个面试题,其中的解题过程比较有趣,有很多值得借鉴的地方,这里写出来作为记录。 题目 假设一栋100层的楼,两个完全一样的鸡蛋。...

377130
来自专栏IT派

TensorFlow中的那些高级API

摘要: 在这篇文章中,我们将看到一个使用了最新高级构件的例子,包括Estimator(估算器)、Experiment(实验)和Dataset(数据集)。值得注...

54650
来自专栏简书专栏

基于Keras+CNN的MNIST数据集手写数字分类

Keras官方github链接:https://github.com/keras-team/keras 官方的口号是Keras: Deep Learning ...

94320

扫码关注云+社区

领取腾讯云代金券