c++opencv显示中文_图像处理入门 100 题,有人把它翻译成了中文版!

点击上方“AI有道”,选择“星标”公众号

重磅干货,第一时间送达1f949b4e35786ce6d8e389f9125801e4.png

之前,我发文推荐过一份图像处理入门 100 题,主要针对图像处理的一些基本操作,非常适合入门!

但是,这份资源教程是由日本人写的,日文版,读起来非常不方便。好消息,最近我在逛 GitHub 的时候,发现有人将这份教程翻译成了中文版。该项目包含了 CV 领域,OpenCV 图像处理入门 100 题实例解析,并配备完整的 Pyhon 代码。

首先,放上原版日文地址:

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

对应的中文版翻译地址:

https://github.com/gzr2017/ImageProcessing100Wen

e66078e5c28c03fa77e8f477fed9d27d.png

Tutorial

1f806230813ebaac22643c0f0fa7e5f5.png

这部分的极简教程主要是介绍图像处理开源库 OpenCV 的安装,读取、显示图像、操作像素等一些基本操作。分为 Python 版和 C++ 两种形式。

作者推荐了 OpenCV 的极简安装方法:

1. 安装 MiniConda

地址:https://conda.io/miniconda.html

2. 创建虚拟环境并激活

$ conda create python = 3.6  -  n gasyori 100
$ source actiavte gasyori 100

3. 安装包

$ pip install -r requirement.txt

其中,requirement.txt 文件在项目根目录下,下载至命令行所在目录直接运行上述命令即可。

该项目总共包含了 100 道图像处理入门题,下面分别来看一下!

问题 1-10

239fb622719724d0d29a4588b8a8a715.png

这部分提供了 Python 和 C++ 两种形式。例如看中值滤波算法。

Python:

import cv2
import numpy as np

# Read image
img = cv2.imread("imori_noise.jpg")
H, W, C = img.shape


# Gaussian Filter
K_size = 3
sigma = 1.3

## Zero padding
pad = K_size // 2
out = np.zeros((H + pad*2, W + pad*2, C), dtype=np.float)
out[pad:pad+H, pad:pad+W] = img.copy().astype(np.float)

## Kernel
K = np.zeros((K_size, K_size), dtype=np.float)
for x in range(-pad, -pad+K_size):for y in range(-pad, -pad+K_size):
        K[y+pad, x+pad] = np.exp( -(x**2 + y**2) / (2* (sigma**2)))
K /= (sigma * np.sqrt(2 * np.pi))
K /= K.sum()

tmp = out.copy()

for y in range(H):for x in range(W):for c in range(C):out[pad+y, pad+x, c] = np.sum(K * tmp[y:y+K_size, x:x+K_size, c])

out = out[pad:pad+H, pad:pad+W].astype(np.uint8)

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

C++ 版:

#include 
#include 
#include 
#include 


// gaussian filter
cv::Mat gaussian_filter(cv::Mat img, double sigma, int kernel_size){
  int height = img.rows;
  int width = img.cols;
  int channel = img.channels();

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

  // prepare kernel
  int pad = floor(kernel_size / 2);
  int _x = 0, _y = 0;
  double kernel_sum = 0;
  
  // get gaussian kernel
  float kernel[kernel_size][kernel_size];

  for (int y = 0; y < kernel_size; y++){
    for (int x = 0; x < kernel_size; x++){
      _y = y - pad;
      _x = x - pad;
      kernel[y][x] = 1 / (2 * M_PI * sigma * sigma) * exp( - (_x * _x + _y * _y) / (2 * sigma * sigma));
      kernel_sum += kernel[y][x];
    }
  }

  for (int y = 0; y < kernel_size; y++){
    for (int x = 0; x < kernel_size; x++){
      kernel[y][x] /= kernel_sum;
    }
  }
  

  // filtering
  double v = 0;
  
  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<:vec3b>(y + dy, x + dx)[c] * kernel[dy + pad][dx + pad];
          }
        }
      }
      out.at<:vec3b>(y, x)[c] = v;
      }
    }
  }return out;
}int main(int argc, const char* argv[]){// read image
  cv::Mat img = cv::imread("imori_noise.jpg", cv::IMREAD_COLOR);// gaussian filter
  cv::Mat out = gaussian_filter(img, 1.3, 3);//cv::imwrite("out.jpg", out);
  cv::imshow("answer", out);
  cv::waitKey(0);
  cv::destroyAllWindows();return 0;
}

问题 11-20

d62d74bb4ca8d6bd85e3457726f2f598.png

问题 21-30

9276d8e36c4c0617d13b03fb672b94c4.png

问题 31-40

db2da7733ce3322db2dbffeb077be867.png

问题 41-50

42c14bae841180b7b4595a4fdc537be7.png

问题 51-60

cb3bbfbf3fdbae5767018899d6110c3e.png

问题 61-70

bd1414d17f3e2fe5091d5ce29fc9f93c.png

问题 71-80

0e707c79d4ed4e2b23abfb041caa364f.png

问题 81-90

36a6f30309c2c9f2e70b357e184cd219.png

问题 91-100

d0b726f44460dd0e36e2c48574fdfff4.png

该项目最大的特色就是 100 题循序渐进,基本涵盖了 OpenCV 的关键知识点。如果你正在入门 CV,正在学习 OpenCV,那么这个项目将会是一个不错的从入门到进阶的教程。上手代码,亲自跑一跑结果,希望对大家有所帮助!


推荐阅读

(点击标题可跳转阅读)

完备的 AI 学习路线,最详细的资源整理!

干货 | 公众号历史文章精选

我的深度学习入门路线

我的机器学习入门路线图

c3f2e7b7cae854fa08d132abc9193bc7.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 OpenCV 处理 DICOM 图像,你需要先将 DICOM 文件读入内存中,然后将其转换为 OpenCV Mat 对象。可以使用 pydicom 库来读取 DICOM 文件,然后使用 OpenCV 的 cv2.imread() 函数将其转换为 Mat 对象。 以下是一个简单的示例代码,演示如何读取 DICOM 文件并将其转换为 OpenCV Mat 对象: ```python import cv2 import pydicom # 读取 DICOM 文件 ds = pydicom.dcmread('path/to/dicom/file.dcm') # 将 DICOM 数据转换为 OpenCV Mat 对象 img = ds.pixel_array.astype('uint16') img = cv2.normalize(img, None, 0, 65535, cv2.NORM_MINMAX) img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) ``` 对于将照片转换为素描风格,可以使用 OpenCV 中的 Pencil Sketch 算法。该算法包括两个步骤:首先将图像转换为灰度图像,然后应用高斯模糊和 Sobel 滤波器来生成素描效果。 以下是一个简单的示例代码,演示如何将照片转换为素描风格: ```python import cv2 # 读取图像 img = cv2.imread('path/to/image.jpg') # 将图像转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 应用高斯模糊 gray_blur = cv2.GaussianBlur(gray, (21, 21), 0) # 应用 Sobel 滤波器 sobelx = cv2.Sobel(gray_blur, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(gray_blur, cv2.CV_64F, 0, 1, ksize=5) sobel = cv2.addWeighted(sobelx, 1, sobely, 1, 0) # 反转颜色并应用归一化阈值 sketch = 255 - cv2.threshold(sobel, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] sketch = cv2.normalize(sketch, None, 0, 255, cv2.NORM_MINMAX) # 显示结果 cv2.imshow('Original', img) cv2.imshow('Sketch', sketch) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这将显示原始图像和转换后的素描图像。你可以调整算法的参数来获得不同的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值