GithubHelp home page GithubHelp logo

gzr2017 / imageprocessing100wen Goto Github PK

View Code? Open in Web Editor NEW

This project forked from ryoppippi/gasyori100knock

3.6K 97.0 1.1K 18.96 MB

「画像処理100本ノック」中文版本!为图像处理初学者设计的 100 个问题。

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

License: MIT License

Python 54.45% C++ 31.32% Jupyter Notebook 13.27% HTML 0.97%

imageprocessing100wen's Introduction

图像处理 100 问!!

  • 日本语本当苦手,==翻译出错还请在issue指正或直接发起 PR。代码算法方面的问题请往原repo提。==现阶段我并没有做这些题目(捂脸),只是翻译而已,因此算法细节可能没有翻译到位。不太好翻译的地方我也会在一定程度上意译自行发挥,请各位谅解。后续在写代码的途中会对翻译有所更正。我会尽量附上英文术语,有翻译不清楚的地方还请参照原文、英语及代码。

  • 关于$\LaTeX$公式渲染问题:

    • 在线阅读建议安装MathJax Plugin for Github插件获得其实不太良好的公式阅读体验;
    • 离线阅读建议使用可以渲染$\LaTeX$公式的Markdown编辑器/阅读器,如Typora(我是用这个编写和转换PDF的)和MWeb。VSCode使用者建议安装Markdown All in One插件渲染$\LaTeX$公式;
    • 各个README文件在完成基本校对之后会转为PDF文件。PDF文件阅读效果最佳。
  • 有签名戳——gzr的引用部分和脚注都是译注。译注可能会打扰大家阅读,请各位谅解。

感谢!

——gzr

English is here (KuKuXia translates into English)

https://github.com/KuKuXia/Image_Processing_100_Questions

Chinese is here (gzr2017, my ex-colleague, translates into Chinese)

https://github.com/gzr2017/ImageProcessing100Wen

Description

为图像处理初学者设计的100个问题完成了啊啊啊啊啊(´;ω;`)

和蝾螈一起学习基本的图像处理知识,理解图像处理算法吧!解答这里的提出的问题请不要调用OpenCVAPI自己动手实践吧!虽然包含有答案,但不到最后请不要参考。一边思考,一边完成这些问题吧!

  • 问题不是按照难易程度排序的。虽然我尽可能地提出现在流行的问题,但在想不出新问题的情况下也会提出一些没怎么听说过的问题(括弧笑)。

  • **这里的内容参考了各式各样的文献,因此也许会有不对的地方,请注意!**如果发现了错误还请发起PR ,帮助我改正!!

  • 【注意】使用这个页面造成的任何事端,本人不负任何责任。请您自担风险。

    俺也一样。使用这个页面造成的任何事端,本人不负任何责任。

    ——gzr

喜欢Python和C++的人来试试吧♡(最近新加了JavaScript呢)

2019.5.14. これ金にならんかなぁ…

如果有什么意见或者成绩的话也请一并告诉我!

如果这对大家有用的话,我们也将接受捐赠(括弧笑)

Related

★追記 2019.11.7

Study-AI株式会社様 http://kentei.ai/ のAI実装検定のシラバスに使用していただくことになりました!(ディープラーニング無限ノックも)Study-AI株式会社様ではAIスキルを学ぶためのコンテンツを作成されており、AIを学ぶ上でとても参考になります!

検定も実施されてるので、興味ある方はぜひ受けることをお勧めします!

深度学习无限问请点击这里

Recent

我也在Twitter上发布更新信息。

  • 2019.11.22 [C++] Q.49~50 モルフォロジー処理(オープンイング、クロージング)を追加
  • 2019.11.21 [C++] Q.48 モルフォロジー処理(収縮)を追加
  • 2019.11.20 [C++] Q.47 モルフォロジー処理(膨張)を追加
  • 2019.10.27 [C++] Q.44~46 Hough直線検出を追加、[Python]の解答を修正
  • 2019.10.22 [C++] Q.41~43 Cannyのエッジ検出を追加, [Python] の解答を修正
  • 2019.9.3 [Python] Q.81~100のAnswerコードをメソッド化
  • 2019.9.2 [Python] Q.61~80のAnswerコードをメソッド化
  • 2019.8.28 [Python] Q.51~60のAnswerコードをメソッド化
  • 2019.8.18 [Python] Q.50までのAnswerコードをメソッド化
  • 2019.8.12 [C++]Q.36-40の解答追加
  • 2019.7.32 [C++]Q.32-35の解答追加
  • 2019.7.23 [C++]Q.30-31の解答追加
  • 2019.7.22 [C++]Q.25-29の解答追加
  • 2019.6.30 Q.21-24のC++の解答追加
  • 2019.6.8 JavaScriptのチュートリアルを追加
  • 2019 Q.11-20 C++ を追加 Q.15 Sobelを修正
  • 2019.3.25 Q.31 フーリエ系 Q.36 DCT, Q.47,48 トップハット変換系を修正
  • 2019.3.13 Q95-100 Neural Networkを修正
  • 2019.3.8 Questions_01_10 にC++の解答を追加!
  • 2019.3.7 TutorialにC++用を追加 そろそろC++用の答えもつくろっかなーと
  • 2019.3.5 各Questionの答えをanswersディレクトリに収納
  • 2019.3.3 Q.18-22. 一部修正
  • 2019.2.26 Q.10. メディアンフィルタの解答を一部修正
  • 2019.2.25 Q.9. ガウシアンフィルタの解答を一部修正
  • 2019.2.23 Q.6. 減色処理のREADMEを修正
  • 2019.1.29 HSVを修正

首先

打开终端,输入以下指令。使用这个命令,你可以将整个目录完整地克隆到你的计算机上。

$ git clone https://github.com/yoyoyo-yo/Gasyori100knock.git

然后,选择你喜欢的 Python 或者 C++,阅读下一部分——Tutorial!

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

Matplotlib和OpenCV的Tips

请在这之后解答提出的问题。问题内容分别包含在各个文件夹中。请使用示例图片assets/imori.jpg。在各个文件夹中的README.md里有问题和解答。运行答案,请使用以下指令(自行替换文件夹和文件名):

python answers/answer_@@.py

问题

详细的问题请参见各页面下的README文件(各个页面下滑就可以看见)。

  • 为了简化答案,所以没有编写main()函数。
  • 虽然我们的答案以numpy为基础,但是还请你自己查找numpy的基本使用方法。
序号 问题 Python C++ 翻译一校
1 通道替换
2 灰度化(Grayscale)
3 二值化(Thresholding)
4 大津二值化算法(Otsu's Method)
5 $\text{HSV}$变换
6 减色处理
7 平均池化(Average Pooling)
8 最大池化(Max Pooling)
9 高斯滤波(Gaussian Filter)
10 中值滤波(Median Filter)
序号 内容 Python C++ 翻译一校
11 均值滤波器
12 Motion Filter
13 MAX-MIN滤波器
14 差分滤波器(Differential Filter)
15 Sobel滤波器
16 Prewitt滤波器
17 Laplacian滤波器
18 Emboss滤波器
19 LoG滤波器
20 直方图
序号 内容 Python C++ 翻译一校
21 直方图归一化(Histogram Normalization)
22 直方图操作
23 直方图均衡化(Histogram Equalization)
24 伽玛校正(Gamma Correction)
25 最邻近插值(Nearest-neighbor Interpolation)
26 双线性插值(Bilinear Interpolation)
27 双三次插值(Bicubic Interpolation)
28 仿射变换(Afine Transformations)——平行移动
29 仿射变换(Afine Transformations)——放大缩小
30 仿射变换( Afine Transformations )——旋转
序号 内容 Python C++ 翻译一校
31 仿射变换(Afine Transformations)——倾斜
32 傅立叶变换(Fourier Transform)
33 傅立叶变换——低通滤波
34 傅立叶变换——高通滤波
35 傅立叶变换——带通滤波
36 JPEG 压缩——第一步:离散余弦变换(Discrete Cosine Transformation)
37 峰值信噪比(Peak Signal to Noise Ratio)
38 JPEG 压缩——第二步:离散余弦变换+量化
39 JPEG 压缩——第三步:YCbCr 色彩空间
40 JPEG 压缩——第四步:YCbCr+DCT+量化
序号 内容 Python C++ 翻译一校
41 Canny边缘检测:第一步——边缘强度
42 Canny边缘检测:第二步——边缘细化
43 Canny边缘检测:第三步——滞后阈值
44 霍夫变换(Hough Transform)/直线检测——第一步:霍夫变换
45 霍夫变换(Hough Transform)/直线检测——第二步:NMS
46 霍夫变换(Hough Transform)/直线检测——第三步:霍夫逆变换
47 形态学处理:膨胀(Dilate)
48 形态学处理:腐蚀(Erode)
49 开运算(Opening Operation)
50 闭运算(Closing Operation)
序号 内容 Python C++ 翻译一校
51 形态学梯度(Morphology Gradient)
52 顶帽(Top Hat)
53 黑帽(Black Hat)
54 使用误差平方和算法(Sum of Squared Difference)进行模式匹配(Template Matching)
55 使用绝对值差和(Sum of Absolute Differences)进行模式匹配
56 使用归一化交叉相关(Normalization Cross Correlation)进行模式匹配
57 使用零均值归一化交叉相关(Zero-mean Normalization Cross Correlation)进行模式匹配
58 $4-$邻域连通域标记
59 $8-$邻域连通域标记
60 透明混合(Alpha Blending)
序号 内容 Python C++ 翻译一校
61 $4-$连接数
62 $8-$连接数
63 细化处理
64 Hilditch 细化算法
65 Zhang-Suen 细化算法
66 方向梯度直方图(HOG)第一步:梯度幅值・梯度方向
67 方向梯度直方图(HOG)第二步:梯度直方图
68 方向梯度直方图(HOG)第三步:直方图归一化
69 方向梯度直方图(HOG)第四步:可视化特征量
70 色彩追踪(Color Tracking)
序号 内容 Python C++ 翻译一校
71 掩膜(Masking)
72 掩膜(色彩追踪(Color Tracking)+形态学处理)
73 缩小和放大
74 使用差分金字塔提取高频成分
75 高斯金字塔(Gaussian Pyramid)
76 显著图(Saliency Map)
77 Gabor 滤波器(Gabor Filter)
78 旋转 Gabor 滤波器
79 使用 Gabor 滤波器进行边缘检测
80 使用 Gabor 滤波器进行特征提取
序号 内容 Python C++ 翻译一校
81 Hessian 角点检测
82 Harris 角点检测第一步:Sobel + Gausian
83 Harris 角点检测第二步:角点检测
84 简单图像识别第一步:减色化+直方图
85 简单图像识别第二步:判别类别
86 简单图像识别第三步:评估
87 简单图像识别第四步:k-NN
88 k-平均聚类算法(k -means Clustering)第一步:生成质心
89 k-平均聚类算法(k -means Clustering)第二步:聚类
90 k-平均聚类算法(k -means Clustering)第三步:调整初期类别
序号 内容 Python C++ 翻译一校
91 利用 k-平均聚类算法进行减色处理第一步:按颜色距离分类
92 利用 k-平均聚类算法进行减色处理第二步:减色处理
93 准备机器学习的训练数据第一步:计算 IoU
94 准备机器学习的训练数据第一步:随机裁剪(Random Cropping)
95 神经网络(Neural Network)第一步:深度学习(Deep Learning)
96 神经网络(Neural Network)第二步:训练
97 简单物体检测第一步----滑动窗口(Sliding Window)+HOG
98 简单物体检测第二步----滑动窗口(Sliding Window)+ NN
99 简单物体检测第三步----非极大值抑制(Non-Maximum Suppression)
100 简单物体检测第三步----评估 Precision, Recall, F-score, mAP

TODO

adaptivebinalizatino, poison image blending

Citation

@article{yoyoyo-yoGasyori100knock,
    Author = {yoyoyo-yo},
    Title = {Gasyori100knock},
    Journal = {https://github.com/yoyoyo-yo/Gasyori100knock},
    Year = {2019}
}

License

© Yoshito Nagaoka All Rights Reserved.

This is under MIT License.

https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/LICENSE

imageprocessing100wen's People

Contributors

gzr2017 avatar karaage0703 avatar kokosabu avatar wtetsu avatar yoyoyo-yo avatar zpadger avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

imageprocessing100wen's Issues

关于answer_4.py

def otsu_binarization(img, th=128):
    max_sigma = 0
    max_t = 0
    
    # determine threshold
    for _t in range(1, 255):
        v0 = out[np.where(out < _t)]
        m0 = np.mean(v0) if len(v0) > 0 else 0.
        w0 = len(v0) / (H * W)
        v1 = out[np.where(out >= _t)]
        m1 = np.mean(v1) if len(v1) > 0 else 0.
        w1 = len(v1) / (H * W)
        sigma = w0 * w1 * ((m0 - m1) ** 2)
        if sigma > max_sigma:
            max_sigma = sigma
            max_t = _t

    # Binarization
    print("threshold =", max_t)
    th = max_t
    out[out < th] = 0
    out[out >= th] = 255

    return out

作者v0 = out[np.where(out < _t)]中的out可能是指函数传入参的img吧,不是太理解

anwser_21.cpp有一些错误

line 41:
out.atcv::Vec3b(y, x)[_c] = (uchar)((b - a) / (d - c) * (val - c) + a);

这里先计算(b - a) / (d - c)会损失数据,导致结果错误,若b-a=255, d-c=178, 斜率会得出1,结果错误。

应该改成(b-a)*(val-c)/(d-c)+a

Page not found.

你好,当我点击“答案”下方的链接时,
答案
Python >> answers/answer_11.py
C++ >> answers_cpp/answer_11.cpp
跳转出来的页面是“Page not found”,所以一直都是点开上面的文件夹查看答案文件的。

Answer_50 has a problem

In the description, the morphological operation is dilating before eroding. But in your code, you erode before you dilate. And we have the same problem with open operation.
File: ImageProcessing100Wen/Question_41_50/answers_py/answer_49.py, answer_50.py

关于jpeg压缩

jpeg图片压缩四个步骤依次为,颜色模式转换及采样、DCT变换、量化、编码。

Q25:当放大倍数大于等于2时,出现报错

报错信息如下,原因是y代表的y坐标超过了原图(128*128)本身的大小
image

解决方案:由于是运算过程中产生可比如127.5最后向上(round)取整得到128,将向上取整改为向下取整(floor)可以解决

  • 向上取整:
    image

  • 向下取整:
    image

q26

两个min()里面应该减2不然会越界,以及某大神pr的公式错误

answer_28.py can`t runing

I cant`t run this anser even at colaboratory.
error below:img[1:H+1, 1:W+1] = _img
NameError: name '_img' is not defined

问题41处的一点疑惑

获取edge时使用的fx、fy为uint8格式,是否会导致fx、fy计算edge时出现数据溢出反而导致edge的数值偏小?

answer28-31运行成功案例(e.g. answer28)

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


# Affine
def affine(img, a, b, c, d, tx, ty):
    H, W, C = img.shape

    # temporary image
    _img = np.zeros((H + 2, W + 2, C), dtype=np.float32)
    _img[1:H + 1, 1:W + 1] = img

    # get new image shape
    H_new = np.round(H * d).astype(int)
    W_new = np.round(W * a).astype(int)
    out = np.zeros((H_new + 1, W_new + 1, C), dtype=np.float32)

    # get position of new image
    x_new = np.tile(np.arange(W_new), (H_new, 1))
    y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1)

    # get position of original image by affine
    adbc = a * d - b * c
    x = np.round((d * x_new - b * y_new) / adbc).astype(int) - tx + 1
    y = np.round((-c * x_new + a * y_new) / adbc).astype(int) - ty + 1

    x = np.minimum(np.maximum(x, 0), W + 1).astype(int)
    y = np.minimum(np.maximum(y, 0), H + 1).astype(int)

    # assgin pixcel to new image
    out[y_new, x_new] = _img[y, x]

    out = out[:H_new, :W_new]
    out = out.astype(np.uint8)

    return out


# Read image
img = cv2.imread("../imori.jpg").astype(np.float32)

# Affine
out = affine(img, a=1, b=0, c=0, d=1, tx=30, ty=-30)

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

answer_32.cpp中傅立叶正逆变换的问题

line 46:val /= sqrt(height * width);
line 73: g = std::abs(val) / sqrt(height * width);
我昨天在做的时候就觉得很奇怪,怎么会能用错误的式子给出正确解答,看到answer_32.cpp就明白了...这愣是把逆变换的中的g = std::abs(val) /(height * width);拆分成了在正逆变换中分别除以sqrt(height * width)的形式...😂

question31_40文件夹中readme中出错

  1. 使用仿射变换,输出(1)那样的$x$轴倾斜$30$度的图像( $d_x=30$),这种变换被称为X-sharing。
  2. 使用仿射变换,输出(2)那样的y轴倾斜$30$度的图像( $d_y=30$),这种变换被称为Y-sharing。
  3. 使用仿射变换,输出(3)那样的$x$轴、$y$轴都倾斜$30$度的图像($d_x = 30$,$d_y = 30$)。

以及底下的两个公式,t_x,t_y都应该替换为d_x和d_y

Canny算法最后一步 大小阈值 错了吧

首先谢谢楼主的翻译!

首先定义p_low为值大于小阈值的像素, p_high为>大阈值点的像素.

楼主实现的canny是: p_low属于edge, 仅当他周围有一个p_high.

但实际上的算法应该是: p_low属于edge, 当他通过一系列p_low连接到了某个p_high. (所以会比楼主的算法产生更多的边缘点). 然后这应该是用dfs实现的吧.

代码疑问

在文件https://github.com/gzr2017/ImageProcessing100Wen/blob/master/Question_01_10/answers_cpp/answer_9.cpp

for (int y = 0; y < height; y++){
    for (int x = 0; x < width; x++){
      for (int c = 0; c < channel; c++){

      v = 0;

      for (int dy = -pad; dy < pad + 1; dy++){
        for (int dx = -pad; dx < pad + 1; dx++){
          if (((x + dx) >= 0) && ((y + dy) >= 0)){
            v += (double)img.at<cv::Vec3b>(y + dy, x + dx)[c] * kernel[dy + pad][dx + pad];
          }
        }
      }
      out.at<cv::Vec3b>(y, x)[c] = v;
      }
    }
  }

这个

if (((x + dx) >= 0) && ((y + dy) >= 0))

是不是有问题。

q27中的公式问题

像素间距离公式有问题

  • a容易与下面的权重函数中的a混淆
  • 如果我没理解错的话, ax/ay是指x/y方向上的放大倍数, 公式像a*x/a*y, 尤其是在渲染后的pdf中

q81

答案缺失

关于第七个问题平均池化

平均池化的输入矩阵大小和输出矩阵大小应该不是一样大,为什么代码中要将均值化后的值赋给每一个像素?

answer_22.cpp中的标准差计算

  // get sum
  for (int y = 0; y < height; y++){
    for (int x = 0; x < width; x++){
      for (int c = 0; c < 3; c++){
        val = (float)img.at<cv::Vec3b>(y, x)[c];
        sum += val;
        squared_sum += (val * val);
      }
    }
  }

  // get standard deviation
  m = sum / (height * width * channel);
  s = sqrt(squared_sum / (height * width * channel) - m * m);

这一部分的均值计算是没有错的,但是,在计算标准差时,怎么能直接把所有rgb值的平方加起来算均值减去m^2?
https://pdfs.semanticscholar.org/fee0/d0c91442d465f343af18b5fce8aeff594d02.pdf
参考文章中STANDARD DEVIATION计算,应该是先计算出均值之后算每个值平方减去均值的平方再开根号。

answer_10.cpp 中值问题

// get and assign median
std::sort(vs, vs + (kernel_size * kernel_size));
out.atcv::Vec3b(y, x)[c] = (uchar)vs[int(floor(count / 2)) + 1];
既然取的是中值,索引从0开始,不应该+1吧

关于引用的许可

你好,我写了关于这个题目系列的csdn博客文章,其中引用了你的翻译内容,希望得到许可。
还有,方便留个联系方式(email or qq)相互交流吗?

q4答案缺失

q4答案链接失效日版有,还有后面几个线性滤波的代码kernel的大小都是动态申请的(cpp),一般现在的vc应该都过不了编译把

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.