使用 c++ 将图像转换为 ASCII 艺术
什么是 Ascii 艺术?
ASCII艺术是一种图形设计技术,使用计算机进行演示,由1963年ASCII标准定义的95个可打印字符(总共128个)和ASCII兼容字符集(超过标准7位ASCII的128个字符)拼凑而成。该术语也被广泛用于指代基于文本的视觉艺术。
先决条件
· 安装和配置OpenCV 库
· CMake 已安装和配置CMake
创建CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0)
project(image_to_ascii VERSION 0.1.0)
include(CTest)
enable_testing()
find_package(OpenCV REQUIRED)
include_directories((${OpenCV_INCLUDE_DIRS}))
add_executable(image_to_ascii main.cpp)
target_link_libraries(image_to_ascii ${OpenCV_LIBS})
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
创建一个main.cpp,包含所有必要导入的文件
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <math.h>
int main(int, char **)
{
return 0;
}
使用 opencv 的imread方法读取图像,该方法返回一个Mat对象。
Mat 类表示一个 n 维密集数值单通道(灰度图像)或多通道(彩色图像)数组
cv::Mat image = cv::imread("pikachu.jpg");
将图像转换为灰度图像
彩色图像到灰度图像
cv::Mat grayImage;
cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
声明并实现获取灰度图像像素平方平均值的calculateAvg函数
int calculateAvg(cv::Mat image, int row, int col, int scale)
{
int sum = 0;
int pixelCount = 0;
int r = row, c = col;
while (r <= row + scale && r < image.rows)
{
while (c <= col + scale && c < image.cols)
{
sum += (int)image.at<uchar>(r, c);
pixelCount++;
c++;
}
r++;
}
return sum / pixelCount;
}
声明 ascii 代表的灰度值
std::string gscale = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. ";
在 scale x scale 组中遍历图像的像素,并将 scale x scale 像素方形转换为1个ascii字符
int scale = 4;
for (int i = 0; i < grayImage.rows; i += scale)
{
std::string text = "";
for (int j = 0; j < grayImage.cols; j += scale)
{
// gray color in range (0, 255)
int pixel = calculateAvg(grayImage, i, j, scale);
// 2 ascii character will match 1 pixel, because 1 ascii character height match 2 ascii character width
// so 2 ascii character will be a square
text += gscale[ceil((gscale.length() - 1) * pixel / 255)];
text += gscale[ceil((gscale.length() - 1) * pixel / 255)];
}
std::cout << text << std::endl;
}
现在,如果你构建 CMake 项目并运行该程序,它应该转换你的输入图像并在控制台中打印 ascii 艺术图像。
原文标题:使用 c++ 将图像转换为 ASCII 艺术
-
AI图像革命已来,我们离AI生成的元宇宙生态还有多远?
2022-12-20 -
OpenCV 对图像的基本操作
2022-12-12 -
输入关键词即可生画,AI画家算是艺术家吗?
2022-11-30 -
Innovusion第5万台图像级超远距激光雷达下线
2022-11-28 -
2022年文化艺术品产权交易所研究报告
2022-11-25 -
在 Python 中使用 OpenCV 进行图像处理
2022-11-21 -
数字图像处理:边缘检测
2022-11-17 -
图像上的 OpenCV 算术运算
2022-10-18 -
国际首次!中国科学家“拍摄”到光生电荷转移演化全时空图像
2022-10-13 -
在 C++ 中使用 OpenCV 对图像中的对象进行扭曲透视
2022-10-11 -
使用 Google Colab 训练的图像分类模型
2022-09-28 -
高性能图像传感器的供电
2022-09-14 -
建立重复图像查找系统
2022-09-14 -
使用U-Net方法对航空图像进行语义分割
2022-09-09 -
好消息!知名艺术家入驻增材云平台!
2022-08-31