精选图像处理100题-python&c++版本

图像处理100题介绍

图像处理经常会使用opencv及其实现的各种算法, 如仿射变换、滤波等.
最近一直苦恼怎么再学习下opencv、opengl等, 浏览知乎的时候发现了这个图像处理100问,发现完成度还是蛮高的,所以就先mark下,留待后续联系用

这份资源教程是用日语写的,读起来非常不方便。不过好人guozirui帮忙把这份教程翻译成了中文版。该项目包含了 CV 领域,OpenCV 图像处理入门 100 题实例解析,并配备完整的 Pyhon 代码。

端上fork的github地址
https://github.com/kiah2008/ImageProcessing100Wen

内容 Python C++ JavaScript
1 安装
2 读取、显示图像
3 操作像素
4 拷贝图像
5 保存图像
6 练习问题

放上原版日文地址:

https://github.com/yoyoyo-yo/Gasyori100knock

对应的中文版翻译地址:

https://github.com/gzr2017/ImageProcessing100Wen

100题练习

后续会登录100题的解题过程, 欢迎后续关注

问题1-通道交换

读取图像,然后将RGB通道替换成BGR通道。

下面的代码用于提取图像的红色通道。

注意,cv2.imread() 的系数是按BGR顺序排列的!

其中的变量red表示的是仅有原图像红通道的imori.jpg。

import cv2
img = cv2.imread("imori.jpg")
red = img[:, :, 2].copy()
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

// Channel swap
cv::Mat channel_swap(cv::Mat img){
  // get height and width
  int width = img.cols;
  int height = img.rows;

  // prepare output
  cv::Mat out = cv::Mat::zeros(height, width, CV_8UC3);

  // each y, x
  for (int y = 0; y < height; y++){
    for (int x = 0; x < width; x++){
      // R -> B
      out.at<cv::Vec3b>(y, x)[0] = img.at<cv::Vec3b>(y, x)[2];
      // B -> R
      out.at<cv::Vec3b>(y, x)[2] = img.at<cv::Vec3b>(y, x)[0];
      // G -> G
      out.at<cv::Vec3b>(y, x)[1] = img.at<cv::Vec3b>(y, x)[1];
    }
  }

  return out;
}

int main(int argc, const char* argv[]){
  // read image
  cv::Mat img = cv::imread("imori.jpg", cv::IMREAD_COLOR);

  // channel swap
  cv::Mat out = channel_swap(img);

  //cv::imwrite("out.jpg", out);
  cv::imshow("sample", out);
  cv::waitKey(0);
  cv::destroyAllWindows();

  return 0;
}
内容 结果

参考资料

知乎图像处理

标签:, ,

About: kiah


发表评论

电子邮件地址不会被公开。