1)
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
#if 0
Mat dst = 255 - src;
//Mat dst;
dst = src + 50;
#else
Mat dst(src.rows, src.cols, CV_8UC1);
for (int y = 0; y < src.rows; ++y) {
for (int x = 0; x < src.cols; ++x) {
//int v = src.at<uchar>(y, x) + 50;
//if (v > 255) v = 255;
//if (v <= 0) v = 0;
//3항 연산으로
/*v = (v > 255) ? 255 : (v < 0) ? 0 : v;
dst.at<uchar>(y, x) = v;*/
//opencv 제공함수
dst.at<uchar>(y, x) = saturate_cast<uchar>(src.at<uchar>(y,x)+50);
//dst.at<uchar>(y,x) = src.at<uchar>(y, x) + 50; // 좌표 y[행], x[렬]
//포화연산 제대로 적용 x 서 흰색부분이 0으로 됨.
// src.at<uchar>(y,x) uchar 50 int 반환, 2개 데이터 계산시 int로 간주하면 dst 픽셀값설정할때 uchar 로 변환되면서 int가 가질수 없는 픽셀값들이 uchar에서 변환이 생김.
}
}
#endif
imshow("src", src);
imshow("dst", dst);
waitKey();
}
2) adjmean
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char* argv[]) // 프로그램내 이미지 파일이름 지정
{
if (argc < 2) {
cerr << "Usage: adjmean.exe <filename>" << endl;
return -1;
}
// 1. argv[1] 영상을 그레이스케일 형태로 불러오기(src)
Mat src = imread(argv[1], IMREAD_GRAYSCALE); // 사용자가 이미지 파일이름 지정시
//GRAYSCALE로 불러와 src 행렬에 저장
if (src.empty()) {
cerr << "Img load failed!" << endl;
return -1;
}
/*2. 입력 영상의 평균 밝기 구하기*/
int s = 0;
for (int y = 0; y < src.rows; ++y) {
for (int x = 0; x < src.cols; ++x) {
s += src.at<uchar>(y, x);
}
}
int m = s / (src.rows * src.cols);
cout << "Mean value: " << m << endl;
// int m = sum(src)[0]/src.total();
// int m = mean(src)[0];
//3. 평균 밝기 128이 되도록 밝기 보정
Mat dst = src + (128 - m);
//4. 화면 출력
imshow("src", src);
imshow("dst", dst);
waitKey();
}
columbia.bmp
0.22MB
lenna.bmp
0.75MB
tiffany.bmp
0.75MB

'프로그래머스 > OPENCV' 카테고리의 다른 글
| (4) 히스토그램분석 (0) | 2022.12.01 |
|---|---|
| 영상의 명암비 조절 (0) | 2022.12.01 |
| 영상의 밝기 조절(1) (0) | 2022.12.01 |
| 2-5 유용한 OpenCV 기능 (0) | 2022.12.01 |
| 2-4 유용한 OpenCV 함수 (0) | 2022.12.01 |