[Computer Vision/OpenCV] 2. Image Resolution
1. Image Quality
์ด๋ฏธ์ง์ ์ง์ ์ด๋ค ๋ถ๋ถ์์ ๊ฒฐ์ ๋ ๊น?
๋จผ์ , ์ด๋ฏธ์ง์ ๋๋น๊ฐ ์ ๋ช ํ๊ณ , ๋ํ ์ผํด์ผ ํ๋ค.
๋๋ฒ์งธ๋ก๋, Splatial Resolution๊ณผ Intensity Quantization์ด ๋์ ์์ค์ผ๋ก ๋์ด์ผ ํ๋ค.
์๋ ์์๋ฅผ ํตํด์ ์ดํดํด ๋ณด์



๋งจ์์ ์ฌ์ง์ ์๋ณธ ์ฌ์ง์ด๋ค.
์๋ ์ผ์ชฝ์ฌ์ง๋ถํฐ ์ดํด๋ณด์. ์ด ์ฌ์ง์ ์ง์ด ์ข์ง ์์ ์ด์ ๋ Spatial Resolution์ ์๋ค.
์๋ ์ค๋ฅธ์ชฝ ์ฌ์ง์ ๋ณด์. ์ด ์ฌ์ง์ ์ง์ด ์ข์ง ์์ ์ด์ ๋ Intensity Quantization์ ์๋ค.
์ง๊ธ๋ถํฐ Spatial Resolution๊ณผ Quantization์ ๋ํด์ ์ดํดํด ๋ณด์.
2. Spatial Resolution
Spatial Resolution์ ์์์์ ๋ ์ ์ฌ์ด์ ์ต์๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ ์ ์๋ ๋ฅ๋ ฅ์ด๋ค. ์ฆ, ์ฃผ์ด์ง ์์์์ ๋๊ฐ์ ์ธ์ ํ ๋ฌผ์ฒด ์ฌ์ด๋ฅผ ๊ตฌ๋ณํ๋ ์ต์๊ฐ/๊ฐ๊ฒฉ์ ๋งํ๋ค.
๊ณต๊ฐ ํด์๋๋ ํฝ์ ์ ํฌ๊ธฐ, spatial quantization, ๋ ์ฆ์ ์ด์ ๊ฑฐ๋ฆฌ, ์นด๋ฉ๋ผ์ ๊ดํ์์คํ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค.
๊ณต๊ฐ ํด์๋๊ฐ ๋์ ์๋ก ๋ ์์ ๋ฌผ์ฒด๋ฅผ ๋ ์ ๊ตฌ๋ณํ ์ ์๊ฒ ๋๋ค.
๊ณต๊ฐ ํด์๋๊ฐ ๋๋ค = ํ ํฝ์ ์ด ์์ ์์ญ์ ๋ํ๋ = ๊ฐ์ ๋ฉด์ ์ ์์์ ํํํ๋ ํฝ์ ์ ์๊ฐ ๋ง์์ง = ์์ ๋ฌผ์ฒด๋ ๋ ์ ๋ช ํ๊ฒ ๊ตฌ๋ณ๊ฐ๋ฅํด์ง
๊ณต๊ฐ ํด์๋๊ฐ ๋ฎ๋ค = ํ ํฝ์ ์ด ๋ ํฐ ์์ญ์ ๋ํ๋ธ๋ค = ๊ฐ์ ๋ฉด์ ์ ์์์ ํํํ๋ ํฝ์ ์ ์๊ฐ ์์์ง = ๋ฌผ์ฒด ๊ฐ์ ๊ฒฝ๊ณ๊ฐ ํ๋ฆฟํด์ง๋ค.
Spatial Resolution ์ค์ฌ๋ณด๊ธฐ
์ง์ lena ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด ์ด๋ฏธ์ง์ spatial resolution์ ์ค์ฌ๋ณด์.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat downSpatialResolution(Mat input_img) {
Mat img = input_img.clone();
// Down Sampling (1/4)
// ๋ค์ด ์ํ๋ง ํ๋ฉฐ 16๊ฐ ํฝ์
์ค 15๊ฐ์ ํฝ์
์ด ์ฌ๋ผ์ง๋ค.
// 512x512 -> 128x128
resize(img, img, Size(img.cols / 4, img.rows / 4));
// Up Sampling (4)
// ๋ค์ ์ฌ๋ผ์ก๋ 15๊ฐ์ ํฝ์
์ ๋จ์์๋ 1๊ฐ ํฝ์
์ ๊ฐ์ผ๋ก ์ฑ์์ง๋ค
// 128x128 -> 512x512
resize(img, img, Size(img.cols * 4, img.rows * 4));
return img;
}
int main() {
//์ด๋ฏธ์ง ํ์ผ ์ฝ์ด์จ๋ค
Mat img = imread("lena.jpg",IMREAD_COLOR);
if (img.empty()) {
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
//๊ณต๊ฐ ํด์๋๋ฅผ ์ค์ธ๋ค.
Mat img_2 = downSpatialResolution(img);
Mat combined;
hconcat(img, img_2, combined);
// ํฉ์น ์ด๋ฏธ์ง๋ฅผ ํ์
imshow("Comparison: Original vs Processed", combined);
waitKey(0);
return 0;
}

3. Intensity Quantization
์์ ํฌ์คํ ์์ ์ดํด๋ณธ ๋ฐ์ ์ํ๋ฉด ์ฐ๋ฆฌ๋ ๋น์ ๊ฐ๋๋ฅผ 0-255(8 bit)์ ๊ฐ์ผ๋ก quantizationํ์ฌ ์ฌ์ฉํ๊ณ ์๋ค.
์ด๊ฒ์ ๋ ์์ ํฌ๊ธฐ๋ก ์์ํ ํ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ์์ ๋ํ ์ผํ๊ฒ ํํํ ์ ์๋ค.


๊ธฐ์กด์ 8bit๋ก ํํํ๋ intensity๋ฅผ 2bit์ผ๋ก ์์ํ ํ๋ค๊ณ ์๊ฐํ์.
์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ ๊ธฐ์กด 8bit๋ก 0-63์ ๊ฐ์ ํด๋นํ๋ ๊ฐ์ 2bit์์๋ ๋ชจ๋ ์ผ๊ด์ ์ผ๋ก 0์ผ๋ก ์์ํ ๋๊ฒ๋๋ค. ์ด๊ฒ์ด intensity quantization์ ๋ฐ๋ผ ์ด๋ฏธ์ง์ ์์ด ๋จ์ํด์ง๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋๋ค
์์ ์ด๊ธฐ๊ตฌ ์ด๋ฏธ์ง๋ 8bit๊ฐ ์๋ 3bit์ผ๋ก intensity๋ฅผ ์์ํ ํ๊ธฐ ๋๋ฌธ์ ์์ ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๊ฒ ๋ ๊ฒ์ด๋ค.
Intensity Quantization ์ค์ฌ๋ณด๊ธฐ
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat downIntensityQuantization(Mat input_img) {
Mat img = input_img.clone();
img.convertTo(img, CV_8U);
for (int c = 0; c < img.channels(); c++) {
Mat channel;
extractChannel(img, channel, c); // ์ฑ๋ ์ถ์ถ
// Down Sampling (1/64)
// 0~255 -> 0,1,2,3(2bit)
channel = channel / 64;
// Up Sampling (64)
// 0,1,2,3 -> 0,64,128,192
channel = cv::min(channel * 64, 255);
// ์ฑ๋ ๋ค์ img์ ํฉ์นจ
insertChannel(channel, img, c);
}
img.convertTo(img, input_img.type()); //์๋ ํ์
์ผ๋ก ๋ณํ
return img;
}
int main() {
//์ด๋ฏธ์ง ํ์ผ ์ฝ์ด์จ๋ค
Mat img = imread("lena.jpg", IMREAD_COLOR);
if (img.empty()) {
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
Mat img_2 = downIntensityQuantization(img);
Mat combined;
hconcat(img, img_2, combined);
// ํฉ์น ์ด๋ฏธ์ง๋ฅผ ํ์
imshow("Comparison: Original vs Processed", combined);
waitKey(0);
return 0;
}
