当前位置: 首页 > news >正文

OpenCV4.8 开发实战系列专栏之 04 - 图像像素读写操作

大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。

专栏代码全部基于C++ 与Python双语演示,专栏答疑群 请联系微信 OpenCVXueTang_Asst

本文关键知识点:

C++中的像素遍历与访问

  • 数组遍历
  • 指针方式遍历
    Python中的像素遍历与访问
  • 数组遍历

在图像处理和计算机视觉任务中,像素遍历与访问是非常常见的操作。不同编程语言实现这些操作的方式有所不同。以下是C++和Python中常见的像素遍历与访问方法。

C++中的像素遍历与访问

数组遍历

假设你有一个灰度图像(单通道),可以将其存储在一个二维数组(矩阵)中。你可以使用嵌套的for循环来遍历这些像素。

#include <iostream>
#include <vector>int main() {// 假设图像是5x5的灰度图像int width = 5;int height = 5;cv::Mat image = Mat::zeros(Size(width, height ), CV_8UC1);// 填充图像数据(例如,设置为1)for (int y = 0; y < height; ++y) {for (int x = 0; x < width; ++x) {image.at<uchar>(y, x) = 1;}}// 遍历图像像素for (int y = 0; y < height; ++y) {for (int x = 0; x < width; ++x) {std::cout << "Pixel (" << x << ", " << y << "): " << image.at<uchar>(y, x) << std::endl;}}return 0;
}
指针方式遍历

为了提高遍历速度,有时会使用指针直接访问像素数据。这种方式特别适合处理大图像或者需要频繁访问像素的情况。

#include <iostream>
#include <vector>int main() {// 假设图像是5x5的灰度图像int width = 5;int height = 5;cv::Mat image = Mat::ones(Size(width, height ), CV_8UC1);// 使用指针遍历图像像素uchar* image_data = image.data;for (int row = 0; row < h; row++) {for (int col = 0; col < w*cn; col++) {*image_data= 127;image_data++;}}return 0;
}

Python中的像素遍历与访问

数组遍历

在Python中,你可以使用NumPy库来处理图像数据。NumPy提供了强大的数组操作功能,使得图像数据的遍历和访问变得简单。

import numpy as np# 假设图像是5x5的灰度图像
width = 5
height = 5
image = np.zeros((height, width), dtype=np.uint8)# 填充图像数据(例如,设置为1)
image.fill(1)# 遍历图像像素
for y in range(height):for x in range(width):print(f"Pixel ({x}, {y}): {image[y, x]}")

在这个例子中,image是一个二维NumPy数组,每个元素代表一个像素的值。使用嵌套的for循环遍历这个数组的每个元素。

总结:

  • 在C++中,可以使用二维数组或一维数组加指针的方式来遍历和访问像素。
  • 在Python中,NumPy库提供了便捷的数组操作,使得像素遍历和访问变得非常简单。

演示代码

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int artc, char** argv) {Mat src = imread("D:/vcprojects/images/test.png");if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);// 直接读取图像像素int height = src.rows;int width = src.cols;int ch = src.channels();for (int c = 0; c < ch; c++) {for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {if (ch == 3) {Vec3b bgr = src.at<Vec3b>(row, col);bgr[0] = 255 - bgr[0];bgr[1] = 255 - bgr[1];bgr[2] = 255 - bgr[2];src.at<Vec3b>(row, col) = bgr;} else if(ch == 1) {int gray = src.at<uchar>(row, col);src.at<uchar>(row, col) = 255 - gray;}}}}imshow("output", src);// 指针读取Mat result = Mat::zeros(src.size(), src.type());int blue = 0, green = 0, red = 0;int gray;for (int c = 0; c < ch; c++) {for (int row = 0; row < height; row++) {uchar* curr_row = src.ptr<uchar>(row);uchar* result_row = result.ptr<uchar>(row);for (int col = 0; col < width; col++) {if (ch == 3) {blue = *curr_row++;green = *curr_row++;red = *curr_row++;*result_row++ = blue;*result_row++ = green;*result_row++ = red;}else if (ch == 1) {gray = *curr_row++;*result_row++ = gray;}}}}imshow("result", result);waitKey(0);return 0;
}

python 代码演示

import cv2 as cvsrc = cv.imread("D:/vcprojects/images/test.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
h, w, ch = src.shape
print("h , w, ch", h, w, ch)
for row in range(h):for col in range(w):b, g, r = src[row, col]b = 255 - bg = 255 - gr = 255 - rsrc[row, col] = [b, g, r]
cv.imshow("output", src)cv.waitKey(0)
cv.destroyAllWindows()

结束语

学习贵在坚持,学习OpenCV贵在每一天的代码练习,原理跟基本的函数解释,相关知识,后续更新边学边理解,搞技术永远要坚持做长期主义者!我们一起努力!!!

专栏答疑群 请联系微信 OpenCVXueTang_Asst


http://www.mrgr.cn/news/46086.html

相关文章:

  • NatPass: 轻量级内网穿透工具及其多用户支持
  • 物联网的数据安全:如何保护数据和设备安全_物联网平台数据安全
  • WSL(Windows Subsystem for Linux)——简单的双系统开发
  • Cpp::STL—list类的模拟实现(下)(14)
  • finereport制作带刷新和滚动的明细表
  • Python 打包为 .whl(Wheel)格式的包 发布到 PyPI
  • 电桥的作用是什么?
  • dom常见操作方法汇总,通过一个案例熟练掌握
  • chrome extension创建新的window
  • 明达IO:赋能工业机器人新未来
  • 【机器学习】监督学习 vs 非监督学习——如何选择合适的方法
  • 提交gitlab
  • 懂球短视频系统小程序的设计
  • 【fastjson】json对象格式化打印
  • 在Linux上离线安装mysql 基于centos7
  • PCL ICP算法实现点云精配准原理及代码
  • 【开源免费】基于SpringBoot+Vue.JS渔具租赁系统(JAVA毕业设计)
  • 《webpack深入浅出系列》
  • 编译后为什么要链接?
  • 第3天:Android应用组件