I was playing with the light and color of pixels of an image in OpenCV. I came across the redsca开发者_如何学Gole effect. How to implement it in OpenCV? i have tried several ways to manipulating the pixel RGB values. But i have a feeling that i might need to use HSV color space... pls help.
I managed to create Javascript which converts image into mode similar to redscale effect.
EDIT:
I simplified redscale effect and made it closer to the 'real' one.
<html>
<body>
<script type='text/javascript'>
function AppyRedscale(img) {
width = 200;
height = 150;
canvas = document.getElementById("canvas");
cnt = canvas.getContext("2d");
cnt.drawImage(img,0,0);
imageData = cnt.getImageData(0,0,width, height);
imageDataNew = cnt.createImageData(width, height);
for (x = 0; x < width; x++) {
for (y = 0; y < height; y++) {
rgb = getPixel(imageData,x,y);
k = rgb[2]/255;
rgb[0] = Mix(k,rgb[0],255);
rgb[1] = Mix((1-k)*(1-k),rgb[1],0);
rgb[2] = Mix(k,rgb[2],0);
setPixel(imageDataNew, x, y, rgb, 0xff);
}
}
cnt.putImageData(imageDataNew, 0, 0);
};
function Mix(k,x,y) {
return (1-k)*x + k*y;
};
function setPixel(imageData, x, y, rgb, a) {
index = (x + y * imageData.width) * 4;
imageData.data[index+0] = rgb[0];
imageData.data[index+1] = rgb[1];
imageData.data[index+2] = rgb[2];
imageData.data[index+3] = a;
};
function getPixel(imageData, x, y) {
index = (x + y * imageData.width) * 4;
return [imageData.data[index+0],
imageData.data[index+1],
imageData.data[index+2]
];
};
</script>
<canvas id="canvas" width="400" height="300"
style="position: absolute; left: 8; top: 170; z-index: 1;"><br />
Sorry, canvas not supported!<br />
</canvas>
<img id="img" src="data:image/jpeg;base64,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%3D%3D" width="200" height="150" onload="AppyRedscale(this)"/>
</body>
</html>
JsFiddle Demo
in Processing it's so easy.
void redscale() {
loadPixels();
for (int i = 0; i < pixels.length; i++) {
int r = (int) red(pixels[i]);
int g = (int) red(pixels[i]);
int b = (int) red(pixels[i]);
int average= (r+g+b)/3;
pixels[i]= color (255, average, 0);
updatePixels()
}
}
I would do it like this (pixel by pixel):
- convert to grayscale (ignoring transparency for now)
- set the RGB values to the color you want to replace black with (red in this case)
- use the grayscale as transparency (
255 - grayscale
as opacity)
Pseudocode:
const grayscale = inputRed * 0.2126 + inputGreen * 0.7152 +
inputBlue * 0.0722
const outputRed = 255
const outputGreen = 0
const outputBlue = 0
const outputAlpha = (255 - grayscale) * inputAlpha / 255
Note: all inputs including alpha are considered between 0 and 255 and so outputAlpha will be too. You'll need to adapt the code if you work with alpha between 0 and 1.
On the note of 0x69 wanted credit for the answer. I'd very much say that he did in fact not answer the question, which refers to OpenCV.
I know that the question is 'old', but I found I might shed some light on the topic. That which my answer contains, is the approach on how to isolate channels, and subtract these from each other.
My project group and I are in the midst of a project involving c++ and OpenCV 2.3 (version is very important, since OpenCV 2.1 is coded in normal c. The algorithm however does not differ)
What we needed to do was isolate green, and then subtract the red and blue channels, this was how we did it:
void IsolateGreen(Mat mIn, Mat& mOut)
{
Mat inImg (mIn.rows, mIn.cols, CV_8UC3, Scalar(1,2,3));
inImg.data = mIn.data;
Mat channelRed (inImg.rows, inImg.cols, CV_8UC1);
Mat channelGreen (inImg.rows, inImg.cols, CV_8UC1);
Mat channelBlue (inImg.rows, inImg.cols, CV_8UC1);
Mat outImg[] = {channelRed, channelGreen, channelBlue};
int fromTo[] = { 0,2, 1,1, 2,0};
mixChannels( &inImg, 1, outImg, 3, fromTo, 3);
mOut = (channelGreen) - (channelRed + channelBlue);
threshold(mOut, mOut, 10, 255, THRESH_BINARY);
erode(mOut, mOut, Mat(), Point (-1,-1), 1);
dilate(mOut, mOut, Mat(), Point(-1,-1), 3);
}
That which I was thinking you could use was these parts of it
void IsolateGreen(Mat mIn, Mat& mOut)
{
Mat inImg (mIn.rows, mIn.cols, CV_8UC3, Scalar(1,2,3));
inImg.data = mIn.data;
Mat channelRed (inImg.rows, inImg.cols, CV_8UC1);
Mat channelGreen (inImg.rows, inImg.cols, CV_8UC1);
Mat channelBlue (inImg.rows, inImg.cols, CV_8UC1);
Mat outImg[] = {channelRed, channelGreen, channelBlue};
int fromTo[] = { 0,2, 1,1, 2,0};
mixChannels( &inImg, 1, outImg, 3, fromTo, 3);
mOut = channelGreen;
}
The essential part here is the mixChannels function, read more on http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html?highlight=mixchannels#mixchannels
It took some time to understand. And the result will give one or more grayscale images representing individual channels. (You can always do a similar conversion to have the channel you want, mixed to a single channel in an RGB picture, if you want to be able to see that it is red. It's all about intensities, eh :3 )
I have converted this code to opencv in a very simple way. since opencv considers the color as bgr and not rgb, i made some changes. the code works fine ...please edit if there is any mistake.
int main(int argc, char** argv)
{
IplImage* img = cvLoadImage( "D:/test.jpg" );
cvShowImage("Input", img );
int x,y;
double k;
CvScalar s;
for (x = 0; x < img->width; x++ )
{
for(y = 0; y < img->height; y++)
{
s = cvGet2D(img, y, x);
k = s.val[0]/255;
s.val[0] = (1-k) * (1-k) * s.val[0];
s.val[1] = k * s.val[1];
s.val[2] = (1-k) * s.val[2] + k * 255;
cvSet2D(img, y, x, s);
}
}
cvShowImage("Output", img );
cvWaitKey(0);
cvReleaseImage(&img);
return 0;
}
精彩评论