专栏首页行走的机械人【资源分享1】日本同行整理的视觉处理100问

【资源分享1】日本同行整理的视觉处理100问

今天介绍的是一位日本可爱的大佬的github项目,项目地址

https://github.com/gzr2017/ImageProcessing100Wen

图像处理100问,这个项目切切实实的包含了100个各种直击你薄弱底子的问题,看完可以帮你完善很多的知识漏洞和误区。

直接看看目录吧:

截取了三张,应该能看出他覆盖的还是很全面的了叭。附带python和c++两套代码,可以根据自己条件选择。

来随便找一个问题看看:

问题简单直接,还附带一点点知识点介绍,该项目作者本人奉行的是手写代码实现,而不是简单的调用一句opencv的API,可以看看这道题的答案:

C++版:

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <math.h>
// histogram normalization
cv::Mat histogram_normalization(cv::Mat img, int a, int b){
  // get height and width
  int width = img.cols;
  int height = img.rows;
  int channel = img.channels();

  int c, d;
  int val;

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

  // get [c, d]
  for (int y = 0; y < height; y++){
    for (int x = 0; x < width; x++){
      for (int _c = 0; _c < channel; _c++){
        val = (float)img.at<cv::Vec3b>(y, x)[_c];
        c = fmin(c, val);
        d = fmax(d, val);
      }
    }
  }

  // histogram transformation
  for (int y = 0; y < height; y++){
    for ( int x = 0; x < width; x++){
      for ( int _c = 0; _c < 3; _c++){
        val = img.at<cv::Vec3b>(y, x)[_c];

        if (val < a){
          out.at<cv::Vec3b>(y, x)[_c] = (uchar)a;
        }
        else if (val <= b){
          out.at<cv::Vec3b>(y, x)[_c] = (uchar)((b - a) / (d - c) * (val - c) + a);
        }
        else {
          out.at<cv::Vec3b>(y, x)[_c] = (uchar)b;
        }
      }
    }
  }

  return out;
}

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

  // histogram normalization
  cv::Mat out = histogram_normalization(img, 0, 255);

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

  return 0;
}

python版本:

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

# histogram normalization
def hist_normalization(img, a=0, b=255):
  # get max and min
  c = img.min()
  d = img.max()

  out = img.copy()

  # normalization
  out = (b-a) / (d - c) * (out - c) + a
  out[out < a] = a
  out[out > b] = b
  out = out.astype(np.uint8)

  return out

# Read image
img = cv2.imread("imori_dark.jpg").astype(np.float)
H, W, C = img.shape

# histogram normalization
out = hist_normalization(img)

# Display histogram
plt.hist(out.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.savefig("out_his.png")
plt.show()

# Save result
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.imwrite("out.jpg", out)

纯手写实现,真的可以加深你对一个概念的理解。

最后再放一遍github地址:

https://github.com/gzr2017/ImageProcessing100Wen

本文分享自微信公众号 - Opencv视觉实践(gh_31e12b1be0e0),作者:是周旋呀

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【图像处理100问】图像处理之各种像素操作效果(上)

    学校把很多考试都放在暑假考了,我们专业有6科,分布在一个月内。又要备赛数学建模,快乐暑假已经被榨干了... ...

    周旋
  • 我是这样搞定第一次单目相机测距的

    之前在做一个单目测距的小项目,大概需要就是用单目相机,对一个特定的目标进行识别并测算相机与该目标的距离。所以便去网上找了一堆教程,这里给大家总结一下,希望给小白...

    周旋
  • 哈哈哈哈哈哈镜~

    周旋
  • OpenCV中图像频率域滤波

    图像处理不仅可以在空间域进行还可以在频率域进行,把空间域的图像开窗卷积形式,变换得到频率域的矩阵点乘形式得到比较好的效果。转换到频率域最常见的是通过傅里叶变换得...

    OpenCV学堂
  • AVFoundation 框架初探究(四)

    叨叨两句 ----       动手写这篇总结时候也是二月底过完年回来上班了,又开始新的一年了,今年会是什么样子?这问题可能得年底再回答自己了。在家窝了那么久,...

    Mr.RisingSun
  • KotlinConf 2019 观影指南 – 数据科学篇

    在当今这个大数据的时代,越来越多的领域需要通过数据分析及科学方法来提取出有价值的信息,帮助我们理解问题、突破瓶颈。对于互联网公司而言,数据更是他们的立足之本。K...

    bennyhuo
  • linux系统性能分析对策

    解决系统性能问题的一般思路 下面从影响操作系统性能的因素、性能优化工具、系统性能评价标准三个方面介绍优化Linux的一般思路和方法。 影响Linux性能的...

    BGBiao
  • 【tkinter系列 第十二课 Frame和Scrollbar窗口部件 】

    python中通常我们写程序,显示结果和操作都是在终端区,如果要想实现一个有显示界面的程序那该怎样实现呢?python中有好几个库都可以实现,这个系列我们一起来...

    用户7054460
  • 使用系统内置script和scriptreplay命令来记录操作记录

    想要记录整个操作流程,需要使用到两个工具,script和scriptreplay,实验环境是CentOS6.6,默认都是安装的! script命令用来记录整个历...

    BGBiao
  • 教你爬取抖音甜曲《好喜欢你》,感受荷尔蒙的气息

    最近发现一首很火的歌,瞬间让你感受到浓浓的青春懵懂感,这就是王广允的《好喜欢你》。说实话,爬这种爱意浓浓的歌曲似乎不是我们这种单身XX应有的想法,但是还是想体会...

    编程思录

扫码关注云+社区

领取腾讯云代金券