본문 바로가기
개인 공부/영상처리 OpenCV

[영상처리][C++][opencv] 2. 화소 점 처리 실습 :: seoftware

by seowit 2020. 3. 8.

이번 글에서는 색상 변화와 Salt-Pepper 잡음 생성에 대한 코드를 살펴볼 예정이다.

1. 색상 변화
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
//실행할때 cmd에 Project1.exe (img이름).jpg 하면 된다. 
using namespace cv;
using namespace std;

double alpha; //contrast
int beta; //brightness

int main(int argc, char** argv) {
	Mat image = imread(argv[1]);
	Mat new_image = Mat::zeros(image.size(), image.type());

	cout << "Basic Linear Transforms" << endl;
	cout << "-----------------------" << endl;
	cout << "*Enter the alpha value [1.0-3.0] : ";
	cin >> alpha;
	cout << "*Enter the beta value [0-100] : ";
	cin >> beta;

	for (int y = 0; y < image.rows; y++)
	{
		for (int x = 0; x < image.cols; x++)
		{
			for (int c = 0; c < 3; c++)
			{
				new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(image.at<Vec3b>(y, x)[c]) + beta);

			}
		}
	}

	// 버퍼 만들기
	namedWindow("Original Image", 1);
	namedWindow("New Image", 1);

	//가져온 image를 버퍼에 보여주기
	imshow("Original Image", image);
	imshow("New Image", new_image);

	// 다른 키 누를때까지 무한대기
	waitKey(0);

	return 0;
}

- alpha는 대비를 증가시키고, beta는 밝기를 증가시킨다. 이 코드에서 가장 핵심이 되는 부분은 new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(image.at<Vec3b>(y, x)[c]) + beta); 이다. 앞서 했던 채널 3개를 사용하는 대신 for문으로 blue, green, red 채널에 접근 하도록 하였고, 각 화솟값에 alpha를 곱하고 beta를 더했다.

- imread(argv[1]) 로 이미지를 불러왔는데, 뒤에 flag가 생략된 경우에는 1(color)이 default이고, 0을 써주면 gray로 이미지를 불러온다. argv[1]은 cmd 창에서 실행을 시킬 때 입력하는 1번째 인자라는 의미이다. 

- 수행결과  

change color

2. Salt-Pepper 잡음
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>

using namespace cv;
using namespace std;

void salt(Mat &img, int n);

int main(int argc, char** argv) {
	Mat image, result;
	image = imread(argv[1], IMREAD_COLOR);

	if (image.empty())
	{
		cout << "Could not open or find the image" << endl;
		return -1;
	}
	// 버퍼 만들기
	namedWindow("Display window", WINDOW_AUTOSIZE);

	//가져온 image를 버퍼에 보여주기
	imshow("Display window", image);

	result = image.clone();
	salt(result, 3000);

	namedWindow("Processed image");
	imshow("Processed image", result);
	// 다른 키 누를때까지 무한대기
	waitKey(0);
	destroyAllWindows();

	return 0;
}
void salt(Mat &img, int n)
{
	for (int k = 0; k < n; k++)
	{
		int i = rand() % img.cols;
		int j = rand() % img.rows;
		//흑백인 경우
		if (img.channels() == 1)
		{
			img.at<uchar>(j, i) = 255;
		}
		// 컬러인 경우
		else if (img.channels() == 3)
		{
			img.at<Vec3b>(j, i)[0] = 255;
			img.at<Vec3b>(j, i)[1] = 255;
			img.at<Vec3b>(j, i)[2] = 255;
		}
	}
}

 - void salt(Mat &img, int n) 함수는 랜덤으로 계산한 픽셀 (i, j)의 화솟값을 (255,255,255)로 바꾸는 것이다(흑백 사진의 경우에는 255). 코드의 수행이 끝나면 img에 n개의 흰색 점이 찍힌다. 만약에 (255, 255, 255)가 아니라 (255,0,0)으로 설정을 한다면 파란색 점이 3000개가 랜덤으로 찍히게 된다.

- 수행결과

댓글