訂閱
糾錯(cuò)
加入自媒體

使用 c++ 將圖像轉(zhuǎn)換為 ASCII 藝術(shù)

什么是 Ascii 藝術(shù)?

ASCII藝術(shù)是一種圖形設(shè)計(jì)技術(shù),使用計(jì)算機(jī)進(jìn)行演示,由1963年ASCII標(biāo)準(zhǔn)定義的95個(gè)可打印字符(總共128個(gè))和ASCII兼容字符集(超過標(biāo)準(zhǔn)7位ASCII的128個(gè)字符)拼湊而成。該術(shù)語也被廣泛用于指代基于文本的視覺藝術(shù)。

先決條件

· 安裝和配置OpenCV 庫

· CMake 已安裝和配置CMake 

創(chuàng)建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)

創(chuàng)建一個(gè)main.cpp,包含所有必要導(dǎo)入的文件

#include <iostream>

#include <o(jì)pencv2/opencv.hpp>

#include <o(jì)pencv2/imgproc/imgproc.hpp>

#include <math.h>

int main(int, char **)

   return 0;

使用 opencv 的imread方法讀取圖像,該方法返回一個(gè)Mat對(duì)象。

Mat 類表示一個(gè) n 維密集數(shù)值單通道(灰度圖像)或多通道(彩色圖像)數(shù)組

cv::Mat image = cv::imread("pikachu.jpg");

將圖像轉(zhuǎn)換為灰度圖像

彩色圖像到灰度圖像

cv::Mat grayImage;

cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);

聲明并實(shí)現(xiàn)獲取灰度圖像像素平方平均值的calculateAvg函數(shù)

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.a(chǎn)t<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 像素方形轉(zhuǎn)換為1個(gè)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;

現(xiàn)在,如果你構(gòu)建 CMake 項(xiàng)目并運(yùn)行該程序,它應(yīng)該轉(zhuǎn)換你的輸入圖像并在控制臺(tái)中打印 ascii 藝術(shù)圖像。

       原文標(biāo)題 : 使用 c++ 將圖像轉(zhuǎn)換為 ASCII 藝術(shù)

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)