実現したいこと
カラー画像として読み込み、 一回の画像走査(二重ループ)でグレースケール 変換→ネガポジ変換を実施するプログラム
前提
cv::Vec3b s=src_img.atcv::Vec3b(y,x);
uchar val = 0.114 * s[0]
+0.587 * s[1]
+0.299 * s[2]
この変換式を用いてカラー画像を入力してネガポジ画像を出力したい
該当のソースコード
#include <iostream>
// OpenCV用のヘッダファイル
#include <opencv2/opencv.hpp>
//画像ファイル (サイズは小さめが良い)
#define FILE_NAME "./sakura.jpg"
#define WINDOW_NAME_INPUT "input"
#define WINDOW_NAME_OUTPUT "output"
int main(int argc, const char * argv[]) {
//画像の入力
cv::Mat src_img; //画像の型と変数
src_img = cv::imread(FILE_NAME); //画像の読み込み if (src_img.empty()) { //入力失敗の場合 fprintf(stderr, "読み込み失敗\n"); return (-1); } cv::Mat gray_img = cv::Mat(src_img.size(), CV_8UC1); cv::Mat dst_img = cv::Mat(src_img.size(), CV_8UC1);
#define IMAX (255)
for (int y=0; y<src_img.rows; y++) {
for (int x=0; x<src_img.cols; x++) {
cv::Vec3b s=src_img.at<cv::Vec3b>(y,x); uchar val = 0.114 * s[0] +0.587 * s[1] +0.299 * s[2]; dst_img.at<cv::Vec3b>(y,x) = (IMAX-0.114*s[0])+(IMAX-0.587*s[2])+(IMAX-0.299*s[2]); } } cv::imshow(WINDOW_NAME_INPUT, src_img) cv::imshow(WINDOW_NAME_OUTPUT,dst_img); cv::waitKey(); //キー入力待ち (止める) return 0;
}