I have the following piece of code:
imgs = glob.glob('/home/chipin/heart/tray.png')
current_img = io.imread(imgs[0])
cv2.imwrite('/home/chipin/heart/01.png', current_img[0:511,0:511])
The size of picture is 512*512, after being saved, a blue picture turns yellow. It seems that a channel is abandoned. I really don't know why.
Here is the value of current_img:
cv2.imwrite() method is used to save an image to any storage device. This will save the image according to the specified format in current working directory. Parameters: filename: A string representing the file name.
imwrite() returns a boolean value. True if the image is successfully written and False if the image is not written successfully to the local path specified.
imwrite will overwrite existing files without outputting an error or asking for confirmation. Image of any format can be saved using this method. The format of the image is defined by the filename's extension ( . jpg , .
cvtColor() We can change the color space of an image using the cv2. cvtColor() function, which takes the image and the color space conversion code as mandatory parameters.
Your problem is in the fact that skimage.io.imread
loads image as RGB (or RGBA), but OpenCV assumes the image to be BGR or BGRA (BGR is the default OpenCV colour format). This means that blue and red planes get flipped.
Let's try this out with the following simple test image:
First let's try your original algorithm:
import skimage.io
import cv2
img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_1.png', img)
We get the following result:
As you can see, red and blue channels are visibly swapped.
The first approach, assuming you want to still use skimage to read and cv2 to write is to use cv2.cvtColor
to convert from RGB to BGR.
Since the new OpenCV docs don't mention Python syntax, in this case you can also use the appropriate reference for 2.4.x.
import skimage.io
import cv2
img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_2.png', cv2.cvtColor(img, cv2.COLOR_RGB2BGR))
Now we get the following output:
An alternative is to just use OpenCV -- use cv2.imread
to load the image. In this case we're working only with BGR images.
NB: Not providing any flags means cv2.IMREAD_COLOR
is used by default -- i.e. image is always loaded as a 3-channel image (dropping any potential alpha channels).
import cv2
img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)
From your screenshot, it appears that you have a 4 channel image. This would mean RGBA in skimage, and BGRA in OpenCV. The principles would be similar.
cv2.COLOR_RGBA2BGRA
cv2.imread
with flag cv2.IMREAD_UNCHANGED
The image on input (as a png) is in RGB order but the image in memory (as a cv::Mat) is in BGR order.
Use cv2.imread()
for input. So, imread() will internally convert from rgb to bgr and imwrite() will do the opposite, all under the hood.
Here's how you do it:
current_img = cv2.imread('/home/chipin/heart/tray.png')
cv2.imwrite('/home/chipin/heart/01.png', current_img)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With